使用Java讀取XML文件有四種方式:
- DOM
- SAX
- JDOM
- 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解析:
使用接口和抽象基本類方法。性能優異,靈活性好,功能強大和易於使用。
