总体来说,应该分成两类,一类是:DOM,另一类是SAX。而JDOM和DOM4J都是在DOM的基础上进行改进的。
二、具体的解析步骤和流程:
1、Dom解析XML:
(1)创建dom解析器工厂
(2)通过解析器工厂创建解析器
(3)构造一个指向指定文件的输入流
(4)开始解析,并返回Document对象
(5)根据文档的节点获取数据
(6)获取当前节点的属性的值
(7)获取当前节点下的所有子节点列表
相关代码为:
//创建dom解析器工厂 DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); //通过解析器工厂创建解析器 DocumentBuilder db=dbf.newDocumentBuilder(); //构造一个指向指定文件的输入流 InputStream is=Thread.currentThread(). getContextClassLoader().getResourceAsStream("person.xml"); //开始解析,并返回Document对象 Document doc=db.parse(is); List<Teacher>teachers=new ArrayList<Teacher>(); Teacher t=null; //根据文档的节点获取数据 NodeList nodeList=doc.getElementsByTagName("teacher"); t=new Teacher(); for (int i = 0; i < nodeList.getLength(); i++) { Node teacherNode=nodeList.item(i); //获取当前节点的属性id的值 String id=teacherNode.getAttributes().getNamedItem("id").getNodeValue(); System.out.println(id); t.setId(Integer.parseInt(id));//将字符串类型的id转换成整数 //获取当前节点下的所有子节点列表 NodeList childNodeList=teacherNode.getChildNodes(); for (int j = 0; j < childNodeList.getLength(); j++) { //获取主节点下的一个子节点 Node childNode=childNodeList.item(j); String tagName=childNode.getNodeName(); if("name".equals(tagName)){ t.setName(childNode.getFirstChild().getNodeValue()); }else if("desc".equals(tagName)){ t.setDesc(childNode.getFirstChild().getNodeValue()); } } teachers.add(t); } //输出 System.out.println(teachers);2、Sax解析XML:
相关代码为:
public class PersonHandler extends DefaultHandler { private List<Teacher> teachers=null; private Teacher teacher; private String tag; public List<Teacher> getTeachers() { return teachers; } //XML文档开始解析时调用的方法 @Override public void startDocument() throws SAXException { teachers=new ArrayList<Teacher>(); } //解析开始元素时调用的方法 //uri:命名空间 //localName:不带前缀的元素的本地名称 //qName:带前缀的元素名称 //attributes:属性的集合 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if("teacher".equals(qName)){ teacher=new Teacher(); //取出属性,并添加到teacher中 teacher.setId(Integer.parseInt(attributes.getValue("id"))) ; } tag=qName; } //解析结束元素时调用的方法 @Override public void endElement(String uri, String localName, String qName) throws SAXException { if("teacher".equals(qName)){ teachers.add(teacher); } tag=null; } //解析文本内容时调用的方法 @Override public void characters(char[] ch, int start, int length) throws SAXException { if(tag!=null){ if("name".equals(tag)){ teacher.setName(new String(ch,start,length)); }else if("desc".equals(tag)){ teacher.setDesc(new String(ch,start,length)); } } } //XML文档解析完成调用的方法 @Override public void endDocument() throws SAXException { System.out.println("XML解析完毕"); } }3、JDOM解析XML:
相关代码为:
//创建解析器 SAXBuilder builder=new SAXBuilder(); InputStream in=Thread.currentThread().getContextClassLoader().getResourceAsStream("person.xml"); //开始解析 Document doc=builder.build(in); //获取根元素 Element root=doc.getRootElement(); //获取根元素下的所有子元素列表 List<Element> list=root.getChildren(); List<Teacher> teachers=new ArrayList<Teacher>(); //遍历 for (int i = 0; i < list.size(); i++) { Teacher t=new Teacher(); Element e=list.get(i); String id=e.getAttributeValue("id"); t.setId(Integer.parseInt(id)); //获取当前元素的子元素的文本内容 t.setName(e.getChildText("name")); t.setDesc(e.getChildText("desc")); teachers.add(t); } //输出 System.out.println(teachers); }4、DOM4J解析XML:
//创建解析器 SAXReader reader=new SAXReader(); InputStream in=Thread.currentThread().getContextClassLoader().getResourceAsStream("person.xml"); //开始解析,并返回Document对象 Document doc=reader.read(in); Element root=doc.getRootElement(); //获取根元素的所有子元素 Iterator<Element> iters=root.elementIterator(); List<Teacher> list=new ArrayList<Teacher>(); while(iters.hasNext()){ Teacher t=new Teacher(); Element e=iters.next(); t.setId(Integer.parseInt(e.attributeValue("id"))); t.setName(e.elementText("name")); t.setDesc(e.elementText("desc")); list.add(t); } //输出 System.out.println(list);三、DOM和SAX的比较: