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解析:

使用接口和抽象基本類方法。性能優異,靈活性好,功能強大和易於使用。




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM