package com.edu.buu.test_XML; //【下面使我們進行解析的XML文件,這邊爲簡單起見,將test.xml保存於當前工程下,當然也可以將使用全部路徑,關於異常的處理以及文件操作讀者自行選擇】 /** <?xml version="1.0" encoding="utf-8"?> <bookstore> <book id="one"> <name>《冰與火之歌》</name> <author>喬治.馬丁</author> <price>89</price> <outline>《冰與火之歌》主要描述了在一片虛構的中世紀世界裏所發生的 一系列宮廷鬥爭、疆場廝殺、遊歷冒險和魔法抗衡的故事。 在內容及風格上,《冰與火之歌》是現實生活的一面鏡子,人性真實的寫照。</outline> </book> <book id="two"> <name>"Gone with the Wind"</name> <author>Margaret.Mitchell</author> <price>99</price> <language>English</language> <outline>《飄》 是美國女作家瑪格麗特·米切爾(1900—1949) 十年磨一劍的作品,也是惟一的作品。</outline> </book> </bookstore> */ /* 【 可以看到的是我們的test.XML 文件包括一個根節點bookstore,一般這個根節點是不需要解析的,我們只從book節點開始解析,當然解析的目標也包括book節點的屬性id以及id屬性的值和book節點的子節點;還有一部分需要注意的是這邊導入的包是org.w3c這個包】 */ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class TestDOM { public static void main(String[] args){ DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder; try{ documentBuilder = documentBuilderFactory.newDocumentBuilder(); //【我們需要Document的對象接收XML文件的傳入】 Document document = documentBuilder.parse("test.xml"); NodeList bookList = document.getElementsByTagName("book"); System.out.println("test.xml文件共有"+bookList.getLength()+"個book節點"); System.out.println("===========下面使用for循環進行節點遍歷============="); for(int i = 0; i < bookList.getLength(); i ++){ Node bookNode = bookList.item(i); NamedNodeMap namedNodeMap = bookNode.getAttributes(); System.out.println("第"+(i+1)+"個book節點共有"+namedNodeMap.getLength()+"個屬性"); //獲取book節點的屬性名以及屬性值 for(int j = 0;j < namedNodeMap.getLength();j ++){ //*改進的遍歷條件*:if (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) Node attributes = namedNodeMap.item(j); System.out.println("屬性名:"+attributes.getNodeName()); System.out.println("屬性值:"+attributes.getNodeValue()); } //獲取book節點的子節點(用getChildNodes()方法) NodeList childNodeList = bookNode.getChildNodes(); for(int k = 0; k < childNodeList.getLength();k ++){ Node childNode = childNodeList.item(k); if(childNode.getNodeName()!="#text"){ //【注意兩個節點之間的空白部分也被算作一個節點,其值等於#text】 System.out.println("第"+(k+1)+"個子節點名爲:"+childNode.getNodeName()); System.out.println("第"+(k+1)+"個子節點值爲:"+childNode.getFirstChild().getTextContent()); } } } System.out.println("==============結束for循環遍歷=============="); System.out.println(); System.out.println("*************使用常規方法遍歷**************"); //【此方法在知道節點值但不知道節點的屬性以及屬性值的情況下使用比較方便】 for(int m = 0; m < bookList.getLength(); m ++){ Element element = (Element)bookList.item(m); String attributeID = element.getAttribute("id"); System.out.println("第"+(m+1)+"本書的"+"id屬性的值爲:"+attributeID); } }catch(Exception e){ //【注意有異常要及時處理,不要刻意迴避,也不要嵌套過多異常,這樣容易出錯,刻意選擇對異常進行集中處理】 e.getMessage(); } } } /** 【以下是解析結果】 test.xml文件共有2個book節點 =======================下面使用for循環進行節點遍歷========================= 第1個book節點共有1個屬性 屬性名:id 屬性值:one 第2個子節點名爲:name 第2個子節點值爲:《冰與火之歌》 第4個子節點名爲:author 第4個子節點值爲:喬治.馬丁 第6個子節點名爲:price 第6個子節點值爲:89 第8個子節點名爲:outline 第8個子節點值爲:《冰與火之歌》主要描述了在一片虛構的中世紀世界裏所發生的 一系列宮廷鬥爭、疆場廝殺、遊歷冒險和魔法抗衡的故事。 在內容及風格上,《冰與火之歌》是現實生活的一面鏡子,人性真實的寫照。 第2個book節點共有1個屬性 屬性名:id 屬性值:two 第2個子節點名爲:name 第2個子節點值爲:"Gone with the Wind" 第4個子節點名爲:author 第4個子節點值爲:Margaret.Mitchell 第6個子節點名爲:price 第6個子節點值爲:99 第8個子節點名爲:language 第8個子節點值爲:English 第10個子節點名爲:outline 第10個子節點值爲:《飄》 是美國女作家瑪格麗特·米切爾(1900—1949) 十年磨一劍的作品,也是惟一的作品。 ============================結束for循環遍歷============================ ****************************使用常規方法遍歷***************************** 第1本書的id屬性的值爲:one 第2本書的id屬性的值爲:two */
XML是一種可擴展標記語言,用於標記電子文件使其具有結構性的標記語言。標記是指計算機所能理解的信息符號,通過此種標記,計算機之間可以處理包含各種的信息比如文章等。它可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言。 XML非常適合萬維網傳輸,提供統一的方法來描述和交換獨立於應用程序或供應商的結構化數據。是Internet環境中跨平臺的、依賴於內容的技術,也是當今處理分佈式結構信息的有效工具。
Java語言有自己的DOM解析器,對於普通XML文檔的解析效率還是可以的。