java 使用DOM解析XML文檔

    爲何要解析XML文檔?

        W3CSCHOOL給了咱們很好的解釋。java

  1. XML 簡化數據共享

    在真實的世界中,計算機系統和數據使用不兼容的格式來存儲數據。數據庫

    XML 數據以純文本格式進行存儲,所以提供了一種獨立於軟件和硬件的數據存儲方法。瀏覽器

    這讓建立不一樣應用程序能夠共享的數據變得更加容易。dom

  2. XML 簡化數據傳輸

    經過 XML,能夠在不兼容的系統之間輕鬆地交換數據。ide

    對開發人員來講,其中一項最費時的挑戰一直是在因特網上的不兼容系統之間交換數據。ui

    因爲能夠經過各類不兼容的應用程序來讀取數據,以 XML 交換數據下降了這種複雜性。spa

  3. XML 簡化平臺的變動

    升級到新的系統(硬件或軟件平臺),老是很是費時的。必須轉換大量的數據,不兼容的數據常常會丟失。操作系統

    XML 數據以文本格式存儲。這使得 XML 在不損失數據的狀況下,更容易擴展或升級到新的操做系統、新應用程序或新的瀏覽器。3d

  4. XML 使您的數據更有用

    因爲 XML 獨立於硬件、軟件以及應用程序,XML 使您的數據更可用,也更有用。code

    不一樣的應用程序都可以訪問您的數據,不單單在 HTML 頁中,也能夠從 XML 數據源中進行訪問。

    經過 XML,您的數據可供各類閱讀設備使用(手持的計算機、語音設備、新聞閱讀器等),還能夠供盲人或其餘殘障人士使用。

      假如開發人員都是理性的

            假如他們都是理性的,就讓將來的應用程序使用 XML 來交換數據吧。

將來也許會出現某種字處理軟件、電子表格程序以及數據庫,它們可使用純文本格式讀取彼此的數據,而不須要使用任何的轉換程序。

咱們如今能作的只有祈禱微軟公司和全部其餘的軟件開發商在這一方面取得一致了。

摘自:http://www.w3school.com.cn/xml/xml_usedfor.asp

            XML是樹形結構,用DOM方法來解析是很輕易的事情。下面來看一看用DOM怎麼解析XML文檔。

採用了一個簡單的例子來講明一下,有意願的能夠再改進添加代碼。

  1.  從xml得到生成DOM對象樹的解析器

    

     //建立DocumentBuliderFactory對象
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

 

  2.  得到Doucument的生成器,能夠利用解析器的newDocumentBuilder()得到示例

    //建立DocumentBulider對象
    DocumentBuilder db = dbf.newDocumentBuilder();

 

  3.  用DocumentBuilder的parse()解析xml文件得到Doucment對象。

    //建立Document對象
    Document document=db.parse("book.xml");

 

  4.  得到當前節點的子節點

    //建立NodeList對象接收xml文件中的book節點
    NodeList booklist=document.getElementsByTagName("book");

 

  5.  得到子節點的屬性和子節點

    //獲取屬性
    NamedNodeMap nnM = booklist.item(i).getAttributes();
    //獲取子節點
    NodeList bookChildNodes=booklist.item(i).getChildNodes();

 

  下面是我寫的一個小實例,比較簡陋,根據已有的XML文檔進行簡單解析。

      XML文檔:

<?xml version="1.0" encoding="UTF-8" ?>
<bookstore>
    <book id="1">
        <name>111</name>
        <author>222</author>
    </book>
    <book id="2">
        <name>333</name>
        <author>444</author>
    </book>
</bookstore>

樹形結構以下:

 

具體實現以下:

 1 package com.lpp.domxml.test1;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.xml.parsers.DocumentBuilder;
 6 import javax.xml.parsers.DocumentBuilderFactory;
 7 import javax.xml.parsers.ParserConfigurationException;
 8 import javax.xml.soap.Node;
 9 
10 import org.w3c.dom.Document;
11 import org.w3c.dom.NamedNodeMap;
12 import org.w3c.dom.NodeList;
13 import org.xml.sax.SAXException;
14 
15 public class dom
16 {
17 
18     public static void main(String[] args)
19     {
20         // TODO Auto-generated method stub
21         //建立DocumentBuliderFactory對象
22         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
23 
24         try
25         {
26             //建立DocumentBulider對象
27             DocumentBuilder db = dbf.newDocumentBuilder();
28             //建立Document對象
29             Document document=db.parse("book.xml");
30             //建立NodeList對象接收xml文件中的book節點
31             NodeList booklist=document.getElementsByTagName("book");
32             
33             for(int i=0;i<booklist.getLength();i++)
34             {
35                 //遍歷booklist將book節點屬性存儲到NameNodeMap類型的nnM變量中
36                 NamedNodeMap nnM = booklist.item(i).getAttributes();
37                 
38                 System.out.println("第"+(i+1)+"本書");
39                 for(int j=0;j<nnM.getLength();j++)
40                 {
41                     //遍歷nnM變量輸出全部屬性名稱和屬性值
42                     System.out.println(
43                             nnM.item(j).getNodeName()
44                             +"的屬性值"+nnM.item(j).getNodeValue());
45                 }
46                 
47                 NodeList bookChildNodes=booklist.item(i).getChildNodes();
48                 int  bookChildNodeNumber=bookChildNodes.getLength();
49                 int  t=1;
50                 for(int k=0;k<bookChildNodeNumber;k++)
51                 {
52                     //遍歷bookChildNodeNumber變量輸出全部子節點名稱和屬性值
53                     if (bookChildNodes.item(k).getNodeType() == Node.ELEMENT_NODE)
54                     {
55                         System.out.println("        第" + t + "個子節點" + bookChildNodes.item(k).getNodeName()
56                                 +"的節點值"+bookChildNodes.item(k).getTextContent());
57                         //bookChildNodes.item(k).getFirstChildNodes().getNodeValue();
58                         t++;
59                     }
60                 }
61             }
62         } 
63         catch (ParserConfigurationException e)
64         {
65             // TODO Auto-generated catch block
66             e.printStackTrace();
67         }
68 
69         catch (SAXException | IOException e)
70         {
71             // TODO Auto-generated catch block
72             e.printStackTrace();
73         }
74     }
75 
76 }

結果:

 

注意:

  在xml文檔中不單單隻有上面樹形結構圖上面的節點,在每兩個節點之間還有個特殊的text節點,你用getNodeName()方法得到的節點名稱爲#text,

節點值爲空。因此,咱們用if語句判斷一下該節點是否爲Element,bookChildNodes.item(k).getNodeType() == Node.ELEMENT_NODE,這條語句判斷

是否爲element類型的節點。

  獲取節點的文本值的時候,直接用getNodeValue()是不行的。須要用getTextContent(),或者是getFirstChildNodes().getNodeValue(),固然這個是

得到第一個子節點仍是最後一個子節點是由本身定的了。

相關文章
相關標籤/搜索