Java读取XML文件

使用Java读取XML文件有四种方式:

  1. DOM
  2. SAX
  3. JDOM
  4. DOM4j

book.xml文件内容: 

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <书架>
 3     <>
 4         <书名 编号="a_1">JavaWeb程序开发入门</书名>
 5         <作者 分类="AA">传智播客</作者>
 6         <售价 单位="元">60</售价>
 7     </>
 8     <>
 9         <书名 编号="a_2">JavaWeb从入门到精通</书名>
10         <作者 分类="BB">明日科技</作者>
11         <售价>80</售价>
12     </>
13     <>
14         <书名 编号="a_3">计算机文化基础</书名>
15         <作者 分类="CC">山东商务</作者>
16         <售价>40</售价>
17     </>
18 </书架>

 

1.DOM

DOM 解析 XML 的步骤:

1) 创建一个 DocumentBuilderFactory 的对象。

2) 创建一个 DocumentBuilder 对象。

3) 通过DocumentBuilder的parse(...)方法得到Document对象。

4) 通过 getElementsByTagName(...)方法获取到节点的列表。

5) 通过 for 循环遍历每一个节点。

6) 得到每个节点的属性和属性值。

7) 得到每个节点的节点名和节点值。  

  NodeType解释:

  Node(节点)是DOM层次结构中的任何类型的对象的通用名称,Node有很多类型,如元素节点,属性节点,文本节点,注释节点等,通过NodeType区分,常见的有:

节点类型NodeType
元素element 1
属性attribute 2
文本text 3
注释comment 8
文档document 9
 1 import javax.xml.parsers.DocumentBuilder;
 2 import javax.xml.parsers.DocumentBuilderFactory;
 3 
 4 import org.w3c.dom.Document;
 5 import org.w3c.dom.Element;
 6 import org.w3c.dom.Node;
 7 import org.w3c.dom.NodeList;
 8 
 9 
10 public class DomXmlDemo {
11 
12     // 用Element方式
13     public static void element(NodeList list) {
14         for (int i = 0; i < list.getLength(); i++) {
15             Element element = (Element) list.item(i);
16             NodeList childNodes = element.getChildNodes();
17             for (int j = 0; j < childNodes.getLength(); j++) {
18                 if (childNodes.item(j).getNodeType() == Node.ELEMENT_NODE) {
19                     // 获取节点
20                     System.out.print(childNodes.item(j).getNodeName() + ":");
21                     // 获取节点值
22                     System.out.println(childNodes.item(j).getFirstChild().getNodeValue());
23                 }
24             }
25         }
26     }
27 
28     // 用Node方式
29     public static void node(NodeList list) {
30         for (int i = 0; i < list.getLength(); i++) {
31             Node node = list.item(i);
32             NodeList childNodes = node.getChildNodes();
33             for (int j = 0; j < childNodes.getLength(); j++) {
34                 if (childNodes.item(j).getNodeType() == Node.ELEMENT_NODE) {
35                     System.out.print(childNodes.item(j).getNodeName() + ":");
36                     System.out.println(childNodes.item(j).getFirstChild().getNodeValue());
37                 }
38             }
39         }
40     }
41 
42     public static void main(String[] args) {
43         // 1.创建DocumentBuilderFactory对象
44         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
45         // 2.创建DocumentBuilder对象
46         try {
47             DocumentBuilder builder = factory.newDocumentBuilder();
48             Document d = builder.parse("src/book.xml");
49             NodeList sList = d.getElementsByTagName("书");
50             element(sList);// Element方式
51             // node(sList);
52         } catch (Exception e) {
53             e.printStackTrace();
54         }
55     }
56 }

运行结果:

 

 2.SAX 

SAX 方式解析:以事件驱动的XML API,边扫描边解析,解析速度快占用内存少(逐行解析)。

SAX 解析 XML 的步骤:

1) 创建 SAXParserFactory 的对象。

2) 创建 SAXParser 对象(解析器)。

3) 创建一个 DefaultHandler 的子类,并且重写里面的方法。

4) 调用 parse 方法,传入DefaultHandler的子类对象。

DefaultHandler类解释:

在DefaultHandler中有几个比较重要的方法。

1. public void startDocument() throws SAXException

第一个执行方法。

2. public void startElement(String uri, String localName, String qName,   Attributes attributes) throws SAXException

该方法是继第一个方法后第二个执行方法。

3. public void characters(char[] ch, int start, int length)   throws SAXException

这个是继startElement方法后的执行方法。

该方法中的ch把所解析的xml的所有数据都保存进来,且ch初始化为2K数据。start是一个节点">"的位置。length就是">"到下一个"<"的长度。

4. public void endElement(String uri, String localName, String qName)   throws SAXException

若一个节点,比如<name>michael</name>,在执行完characters后会执行该方法。如果节点,比如<names><name>michael</name></names>在执行names节点时,不会执行到该方法。

5. public void endDocument() throws SAXException

最后一个执行方法。

 1 import javax.xml.parsers.SAXParser;
 2 import javax.xml.parsers.SAXParserFactory;
 3 
 4 import org.xml.sax.Attributes;
 5 import org.xml.sax.SAXException;
 6 import org.xml.sax.helpers.DefaultHandler;
 7 
 8 public class SaxXmlDemo {
 9 
10     public static void main(String[] args) throws Exception {
11         // 1.获取SAXParserFactory实例
12         SAXParserFactory factory = SAXParserFactory.newInstance();
13         // 2.获取SAXparser实例
14         SAXParser saxParser = factory.newSAXParser();
15         // 3.创建DefaultHandler的子类对象
16         SAXDemoHandler handler = new SAXDemoHandler();
17         // 4.调用parse()方法,传入DefaultHandler的子类对象
18         saxParser.parse("src/book.xml", handler);
19     }
20 }
21 
22 class SAXDemoHandler extends DefaultHandler {
23     // 遍历xml文件开始标签
24     @Override
25     public void startDocument() throws SAXException {
26         super.startDocument();
27         System.out.println("sax解析开始");
28     }
29 
30     // 遍历xml文件结束标签
31     @Override
32     public void endDocument() throws SAXException {
33         super.endDocument();
34         System.out.println("sax解析结束");
35     }
36 
37     @Override
38     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
39         super.startElement(uri, localName, qName, attributes);
40         if (qName.equals("书")) {
41             System.out.println("============开始遍历=============");
42         } else if (!qName.equals("书") && !qName.equals("书架")) {
43             System.out.print("节点名称:" + qName); // 输出节点名称
44             for (int i = 0; i < attributes.getLength(); i++) {
45                 System.out.print(", 属性:" + attributes.getQName(i) + "=" + attributes.getValue(i));
46             }
47         }
48     }
49 
50     @Override
51     public void endElement(String uri, String localName, String qName) throws SAXException {
52         super.endElement(uri, localName, qName);
53         if (qName.equals("书")) {
54             System.out.println(qName + ":遍历结束");
55             System.out.println("============结束遍历============");
56         }
57     }
58 
59     @Override
60     public void characters(char[] ch, int start, int length) throws SAXException {
61         super.characters(ch, start, length);
62         String value = new String(ch, start, length).trim();
63         if (!value.equals("")) {
64             System.out.println(", 节点内容:" + value); // 输出节点内容
65         }
66     }
67 }

运行结果:

 

 

3.JDOM

JDOM 解析:是一种解析XML的JAVA工具包,是基于树形结构,利用纯JAVA技术对XML文档实现解析,只适用于JAVA语言。

JDOM解析XML的步骤:

1) 创建一个 SAXBuilder 对象。

2) 调用 build 方法,得到 Document 对象(通过 IO 流)。

3) 获取根节点。

4) 获取根节点的直接子节点的集合。

5) 遍历集合。

 到 http://www.jdom.org/downloads/index.html 下载jar包,有1.1.3和2.0.6两个,我们下载,复制到项目的lib目录中,右键添加的Build Path中。

 

  

 1 import java.io.File;
 2 import java.io.FileInputStream;
 3 import java.io.InputStream;
 4 import java.util.List;
 5 
 6 import org.jdom2.Attribute;
 7 import org.jdom2.Document;
 8 import org.jdom2.Element;
 9 import org.jdom2.input.SAXBuilder;
10 
11 public class JdomXmlDemo {
12 
13     public static void main(String[] args) throws Exception {
14         // 1.创建SAXBuilder对象
15         SAXBuilder saxBuilder = new SAXBuilder();
16         // 2.创建输入流
17         InputStream is = new FileInputStream(new File("src/book.xml"));
18         // 3.将输入流加载到build中
19         Document document = saxBuilder.build(is);
20         // 4.获取根节点
21         Element rootElement = document.getRootElement();
22         // 5.获取子节点
23         List<Element> children = rootElement.getChildren();
24         for (Element child : children) {
25             List<Attribute> attributes = child.getAttributes();
26             // 打印属性
27             for (Attribute attr : attributes) {
28                 System.out.println(attr.getName() + ":" + attr.getValue());
29             }
30             List<Element> childrenList = child.getChildren();
31             System.out.println("======获取子节点-start======");
32             for (Element e : childrenList) {
33                 System.out.println("节点名:" + e.getName() + ", 节点值:" + e.getValue());
34                 List<Attribute> childAttributes = e.getAttributes();
35                 for (Attribute attr : childAttributes) {
36                     System.out.println(attr.getName() + "=" + attr.getValue());
37                 }
38             }
39             System.out.println("======获取子节点-end======");
40         }
41     }
42 
43 }

运行结果:

 

 

4.DOM4j

DOM4J :DOM4J是一个JAVA的XML API,JDOM的升级版。

DOM4J 解析 XML 的步骤:

1) 创建 SAXReader 对象。

2) 调用 read 方法。

3) 获取根元素。

4) 通过迭代器遍历直接节点。

通常使用Dom4j工具进行XML的DOM解析,首先要到Dom4j的官网https://dom4j.github.io/下载包并加载到IDE开发工具中(例如eclipse)。

 1 import java.io.File;
 2 import java.util.Iterator;
 3 import java.util.List;
 4 
 5 import org.dom4j.Attribute;
 6 import org.dom4j.Document;
 7 import org.dom4j.Element;
 8 import org.dom4j.io.SAXReader;
 9 
10 public class Dom4jXmlDemo {
11 
12     public static void main(String[] args) throws Exception {
13         // 1.创建Reader对象
14         SAXReader reader = new SAXReader();
15         // 2.加载xml
16         Document document = reader.read(new File("src/book.xml"));
17         // 3.获取根节点
18         Element rootElement = document.getRootElement();
19         Iterator<Element> iterator = rootElement.elementIterator();
20         while (iterator.hasNext()) {
21             Element child = (Element) iterator.next();
22             List<Attribute> attributes = child.attributes();
23             System.out.println("======获取属性值-start======");
24             for (Attribute attribute : attributes) {
25                 System.out.println(attribute.getName() + "=" + attribute.getValue());
26             }
27             System.out.println("======获取属性值-end======");
28             System.out.println("======遍历子节点-start======");
29             Iterator<Element> childIterator = child.elementIterator();
30             while (childIterator.hasNext()) {
31                 Element e = (Element) childIterator.next();
32                 System.out.println("节点名:" + e.getName() + ",节点值:" + e.getStringValue());
33                 List<Attribute> childAttributes = e.attributes();
34                 for (Attribute attr : childAttributes) {
35                     System.out.println(attr.getName() + "=" + attr.getValue());
36                 }
37             }
38             System.out.println("======遍历子节点-end======");
39         }
40     }
41 }

运行结果:

 


 

 

四种解析 XML 的特点

1.DOM 解析:

形成了树结构,有助于更好的理解、掌握,且代码容易编写。解析过程中,树结构保存在内存中,方便修改。

2.SAX 解析:

采用事件驱动模式,对内存耗费比较小。适用于只处理 XML 文件中的数据时。

3.JDOM 解析:

仅使用具体类,而不使用接口。API 大量使用了 Collections 类。

4.DOM4J解析:

使用接口和抽象基本类方法。性能优异,灵活性好,功能强大和易于使用。



posted @ 2021-03-31 11:03  熊猫Panda先生  阅读(10514)  评论(0编辑  收藏  举报