XML解析的四种方式

1. 首先介绍XML的四种解析方式

  ①DOM (Document Object Model) 文档对象模型

  ②SAX (Simple API for XML)

  ③JDOM (Java-based Document Object Model)

  ④DOM4J (Document Object Model for java)

2.以下以代码为例进行说明

  首先以下的所有解析xml文件以 person.xml 为例

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <person>
 3     <teacher id="1">
 4         <name>苗创</name>
 5         <desc>哈哈哈,我是是一个好人</desc>
 6     </teacher>
 7 
 8     <teacher id="2">
 9         <name>saoke</name>
10         <desc>她是我的室友</desc>
11     </teacher>
12 </person>
person.xml

1.DOM

 1 package com.baba.miao.xml;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.util.ArrayList;
 6 import java.util.List;
 7 
 8 import javax.xml.parsers.DocumentBuilder;
 9 import javax.xml.parsers.DocumentBuilderFactory;
10 import javax.xml.parsers.ParserConfigurationException;
11 
12 import org.w3c.dom.Document;
13 import org.w3c.dom.Node;
14 import org.w3c.dom.NodeList;
15 import org.xml.sax.SAXException;
16 
17 import com.baba.miao.vo.Teacher;
18 
19 public class DomParseDemo {
20 
21     public static void main(String[] args) throws ParserConfigurationException,
22             SAXException, IOException {
23         // 创建Dom工厂
24         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
25         // 通过解析工厂创建解析器
26         DocumentBuilder db = dbf.newDocumentBuilder();
27         // 构造指定文件的输入流
28         InputStream is = Thread.currentThread().getContextClassLoader()
29                 .getResourceAsStream("person.xml");
30         // 开始解析,并返回Document
31         Document docu = db.parse(is);
32 
33         List<Teacher> teachers = new ArrayList<Teacher>();
34         Teacher t = null;
35         // 根据存档的节点获取
36         NodeList nodeList = docu.getElementsByTagName("teacher");
37         for (int i = 0; i < nodeList.getLength(); i++) {
38             t = new Teacher();
39             Node teachernode = nodeList.item(i);
40             // 获取当前节点的属性id值
41             String id = teachernode.getAttributes().getNamedItem("id")
42                     .getNodeValue();
43             System.out.println(id);
44             t.setId(Integer.parseInt(id));
45             // 获取当前节点下的所有子节点列表
46             NodeList childNodeLise = teachernode.getChildNodes();
47             for (int j = 0; j < childNodeLise.getLength(); j++) {
48                 // 获取teacher节点下的其中子节点
49                 Node childNode = childNodeLise.item(j);
50                 String tagName = childNode.getNodeName();
51                 if ("name".equals(tagName)) {
52                     // 获取teacher节点下的name节点的值
53                     t.setName(childNode.getFirstChild().getNodeValue());
54                 } else if ("desc".equals(tagName)) {
55                     // 获取teacher节点下的desc节点的值
56                     t.setDesc(childNode.getFirstChild().getNodeValue());
57                 }
58             }
59             teachers.add(t);
60         }
61         // 输出
62         System.out.println(teachers);
63     }
64 }
View Code

2.SAX

四个接口:① ContentHandler接口 ②DTDHandler接口EntityResolver接口ErrorHandler接口

由于DefaultHandler类是sax默认基类,同时实现了上面的四个接口,因此继承该类即可。

SAX解析内容处理器

 1 package com.baba.miao.xml;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import org.xml.sax.Attributes;
 7 import org.xml.sax.SAXException;
 8 import org.xml.sax.helpers.DefaultHandler;
 9 
10 import com.baba.miao.vo.Teacher;
11 
12 /**
13  * SAX解析内容处理器
14  * 
15  * @author Administrator
16  * 
17  */
18 public class PersonHandler extends DefaultHandler {
19 
20     private List<Teacher> teachers = null;
21 
22     public List<Teacher> getTeachers() {
23         return teachers;
24     }
25 
26     private Teacher teacher;
27     private String tag;
28 
29     // XML文档开始解析时,调用的方法
30     @Override
31     public void startDocument() throws SAXException {
32         teachers = new ArrayList<Teacher>();
33     }
34 
35     // 解析开始元素是调用该方法
36     // uri : 标签的命名空间
37     // localName :元素的本地名称(不带前缀)
38     // qName : 带前缀的元素名称
39     // attributes:属性的集合
40     @Override
41     public void startElement(String uri, String localName, String qName,
42             Attributes attributes) throws SAXException {
43         if ("teacher".equals(qName)) {
44             teacher = new Teacher();
45             // 取出属性,并添加teacher中
46             teacher.setId(Integer.parseInt(attributes.getValue("id")));
47         }
48         tag = qName;
49     }
50 
51     // 解析结束元素时调用的方法
52     @Override
53     public void endElement(String uri, String localName, String qName)
54             throws SAXException {
55         if ("teacher".equals(qName)) {
56             teachers.add(teacher);
57         }
58         tag = null;
59     }
60 
61     // 解析文本内容时调用的方法
62     @Override
63     public void characters(char[] ch, int start, int length)
64             throws SAXException {
65         if (tag != null) {
66             if ("name".equals(tag)) {
67                 teacher.setName(new String(ch, start, length));
68             } else if ("desc".equals(tag)) {
69                 teacher.setDesc(new String(ch, start, length));
70             }
71         }
72     }
73 
74     // XML解析完成
75     @Override
76     public void endDocument() throws SAXException {
77         super.endDocument();
78         System.out.println("XML解析完毕");
79     }
80 }
View Code

解析xml

 1 package com.baba.miao.xml;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.util.List;
 6 
 7 import javax.xml.parsers.ParserConfigurationException;
 8 import javax.xml.parsers.SAXParser;
 9 import javax.xml.parsers.SAXParserFactory;
10 
11 import org.xml.sax.SAXException;
12 
13 import com.baba.miao.vo.Teacher;
14 
15 public class SaxParseDemo {
16 
17     public static void main(String[] args) throws ParserConfigurationException,
18             SAXException, IOException {
19         // 创建Sax解析器工厂对象
20         SAXParserFactory factory = SAXParserFactory.newInstance();
21         // 根据工厂创建解析器对象
22         SAXParser sax = factory.newSAXParser();
23         InputStream is = Thread.currentThread().getContextClassLoader()
24                 .getResourceAsStream("person.xml");
25         PersonHandler ph = new PersonHandler();
26         // 开始解析
27         sax.parse(is, ph);
28         List<Teacher> list = ph.getTeachers();
29         System.out.println(list);
30     }
31 }
View Code

3.JDOM

该文档对象,必须引入第三方组件  ---> jdom-2.0.5.jar

下载地址:http://www.jdom.org/downloads/index.html

下载如图:

 1 package com.baba.miao.xml;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.util.ArrayList;
 6 import java.util.List;
 7 
 8 import org.jdom2.Document;
 9 import org.jdom2.Element;
10 import org.jdom2.JDOMException;
11 
12 
13 import org.jdom2.input.SAXBuilder;
14 
15 import com.baba.miao.vo.Teacher;
16 
17 /**
18  * 使用第三方组件
19  * 
20  * @author Administrator
21  * 
22  */
23 public class JdomParseDemo {
24 
25     public static void main(String[] args) throws JDOMException, IOException {
26         //创建解析器
27         SAXBuilder saxBuilder = new SAXBuilder();
28         InputStream is = Thread.currentThread().
29                 getContextClassLoader().getResourceAsStream("person.xml");
30         //开始解析
31         Document docu = saxBuilder.build(is);
32         
33         //获取根元素
34         Element root = docu.getRootElement();
35         //获取根元素下的所有的子元素
36         
37         List<Element> list = root.getChildren();
38         
39         List<Teacher> teachers = new ArrayList<Teacher>();
40         //遍历
41         for(int i = 0;i < list.size();i++){
42             Teacher t = new Teacher();
43             Element e = list.get(i);
44             String id = e.getAttributeValue("id");
45             t.setId(Integer.parseInt(id));
46             //获取当前元素的子元素的文本内容
47             t.setName(e.getChildText("name"));
48             t.setDesc(e.getChildText("desc"));
49             teachers.add(t);
50         }
51         System.out.println(teachers);
52     }
53 }
View Code

4.DOM4J

必须引入第三方组件 ---> dom4j-1.6.1.jar

下载网站 :  http://www.dom4j.org/dom4j-1.6.1/

 1 package com.baba.miao.xml;
 2 
 3 import java.io.InputStream;
 4 import java.util.ArrayList;
 5 import java.util.Iterator;
 6 import java.util.List;
 7 
 8 import org.dom4j.Document;
 9 import org.dom4j.DocumentException;
10 import org.dom4j.Element;
11 import org.dom4j.io.SAXReader;
12 
13 import com.baba.miao.vo.Teacher;
14 
15 public class Dom4jParseDemo {
16 
17     public static void main(String[] args) throws DocumentException {
18         // 创建解析器
19         SAXReader saxReader = new SAXReader();
20 
21         InputStream is = Thread.currentThread().getContextClassLoader()
22                 .getResourceAsStream("person.xml");
23         // 开始解析,并返回Document
24         Document docu = saxReader.read(is);
25         Element root = docu.getRootElement();
26         // 获取根元素的所有子元素
27         Iterator<Element> iters = root.elementIterator();
28         List<Teacher> list = new ArrayList<Teacher>();
29         while (iters.hasNext()) {
30             Teacher t = new Teacher();
31             Element e = iters.next();
32             t.setId(Integer.parseInt(e.attributeValue("id")));
33             t.setName(e.elementText("name"));
34             t.setDesc(e.elementText("desc"));
35             list.add(t);
36         }
37         System.out.println(list);
38     }
39 
40 }
View Code

    比较:

    1.JDOM和DOM在性能测试时表现不佳,在测试10M文档时内存溢出

    2.SAX表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML流,

     但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中). 

     |--> 如果是做手机方面的可以考虑,因为手机很难扩容

    3.DOM4J性能最好,连Sun的JAXM也在用DOM4J.目前许多开源项目中大量采用DOM4J,

     例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J.

     |--> 如果是考虑服务器方面的可以考虑,服务器很容易扩容

            本人是一个JAVA爱好者,欢迎交流

                        ------By 小苗

原文地址:https://www.cnblogs.com/sxmcACM/p/3647545.html