XML解析(二),DOM解析XML
轉載自? ?XML解析(二),DOM解析XML
上篇文章向大家介紹了SAX解析XML,為了這篇文章理解起來更加方便,所以還沒看過SAX解析XML文章的,請戳這【XML解析(一)】SAX解析XML?,這次給大家帶來XML解析系列之DOM解析XML
一、概述
?DOM,擦,這什么鬼,肯定又是什么東西的簡稱了,沒錯,DOM是Document Object Model的簡稱,翻譯過來就是文檔對象模型,是W3C組織推薦的處理可擴展標志語言的標準編程接口,它以面向對象的方式描述了文檔模型,所以有一個名詞叫對象樹,也叫文檔樹。借用百度的一張圖片描述一下這個文檔樹
關于這個文檔樹,有幾個名詞需要知道:
節點(Node):XML中的每個成分都是節點
- 文檔節點:即圖中的:Document
- 每個標簽是一個原元素節點即:Element
- XML元素標簽之間的為文本節點:TextNode
- 每個XML元素節點的屬性為屬性節點:Attribute
xml常見的節點類型
- Node : DOM最基本的數據類型
- Element:常見的元素節點
- Attr:代表元素的屬性
- Text:元素或者Att的值(內容)
- Document:代表整個XML文檔
細心看過SAX解析XML那篇文章的朋友可能發現了在那篇文章中沒少出現標簽,節點,文檔的字眼,其實這些名詞是借用DOM的。OK,對于DOM如要需要了解更多請google或者百度一下,下面我們看看DOM解析XML的優缺點:
DOM解析優點:
- 整個文檔樹在內存中,便于操作;
- 可以修改,刪除、重新排列XML;
- 可以隨機訪問任何一個節點,訪問效率高。
DOM解析的缺點:
- 占用內存大,占用資源多
- 解析速度慢
DOM解析適用場合:
- 需多次訪問這些數據;
- 對解析效率要求不高;
- 硬件資源充足(內存、CPU)。
二、DOM解析XML實戰
DOM解析XML步驟很簡單,基本就兩步,我們只需要知道DOM的層次結構及很實用DOM的一些重要的方法就可以使用DOM解析XML了
為了方便,這里先給出項目的目錄結構,在文章結束后會將本Demo的代碼帖上
目錄結構:
解析步驟:
- 解析XML文件得到Document對象
- 操作Document對象的一系列方法取出我們關心的數據
DOM的一些常用的方法:
- Document.getDocumentElement():返回xml文檔的根元素
- Element.getAttribute():獲取屬性值
- Element.getChildNodes():返回孩子節點集
- Element.getFirstChild():返回第一個孩子節點,通常是TextNode
- Element.getLastChild():得到最后一個孩子節點
- …?
?ps:DOM 相關的API的一些方法基本見名知義,在使用的時候可以查看相應的API文檔或者借助Eclipse等IDE的提示選擇相應的方法使用。
OK,知道了DOM解析XML的步驟及方法,我們新建一個Android項目開始學習一下DOM解析過程
新建一個Android項目DomParseXmlDemo,為了和SAX解析做個比較,我們還是來通過解析的users.xml來練習一下DOM解析。
1、 新建一個xml文件,users.xml
<?xml version="1.0" encoding="UTF-8"?> <users><user id="1"><name>畢向東</name><password>bxd123</password></user><user id="2"><name>韓順平</name><password>hsp123</password></user><user id="3"><name>馬士兵</name><password>msb123</password></user> </users>2、同樣新建一個User類,User.java
package com.example.domparsexmldemo;public class User{private long id;private String name;private String password;public long getId() {return id;}public void setId(long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;} }3、簡單將解析的步驟封裝到一個工具類XmpParseUtils.java中,新建一個方法:
第一步:加載xml資源,得到XML的Document對象
// 1. 加載XML資源,這里和SAX一樣,也可以是File或者UriInputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("users.xml");// 2. 得到文檔構建工廠DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();// 3. 通過構建工廠生產構建類DocumentBuilder newDocumentBuilder = factory.newDocumentBuilder();// 4. 那這個構建類將XML資源解析得到Document對象Document doc = newDocumentBuilder.parse(is);?上面的代碼基本上是一個模板代碼,只是xml路徑會不同,這里得到了Document的對象,完成了解析步驟的第一步,接下來完成第二步
第二步:操作Doc,解析相應的數據
// 得到根節點Element root = doc.getDocumentElement();// 根據指定的標簽名稱得到相應的節點集合NodeList userNodes = root.getElementsByTagName("user");for(int i=0;i<userNodes.getLength();i++){ // 依次解析每個user節點Element userElement = (Element) userNodes.item(i);// 獲取user節點的屬性int id = Integer.valueOf(userElement.getAttribute("id"));User user = new User();user.setId(id);// 接下來解析子元素NodeList childNodes = userElement.getChildNodes();for(int j=0;j<childNodes.getLength();j++){Node childNode = childNodes.item(j);if(childNode.getNodeType() == Node.ELEMENT_NODE){ // 判斷是不是元素節點String nodeName = childNode.getNodeName(); // 得到節點名稱String value = childNode.getFirstChild().getNodeValue(); // 得到第一個子節點的值,這里為TextNodeif("name".equals(nodeName)){ // 如果當前的節點為name,那么它的值就是user的nameuser.setName(value);}else if("password".equals(nodeName)){ // 如果當前的節點為password,那么它的值就是user的passworduser.setPassword(value);}}}users.add(user);}?注釋寫的很詳細,大家有沒有注意到Element.getElementsByTagName(String tagName)方法,這個方法簡直和html中document的一模一樣,只不過這里的Document沒有和html的document的getElementById()和getElementsByName()方法,這是因為xml和html不一樣,xml標簽,屬性等系統沒有賦予特殊的含義,都是自己定義的,是一種數據格式,而html的id或class屬性被賦予了特殊含義,所以xml自然沒有那兩個方法了,呵呵
OK,萬事具備,只差測試了,下面是見證奇跡的時刻
同樣是使用Android的單元測試,關于Android的單元測試,和上篇【XML解析(一)】SAX解析XML一樣,只需要改一下目標包名,這里就不多說了,有疑問的參考【XML解析(一)】SAX解析XML?這篇文章。
測試結果:
可以看到,這里我們使用DOM同樣完成了XML的解析,到這里我們學會了DOM解析XML,對比一下SAX解析,發現DOM解析更加簡單,原理無非拿到根節點,然后依次解析子節點,遍歷循環,調用相應方法,沒有事件觸發,而我們只需要掌握XML DOC文檔樹的層次結構,然后解析相應xml的時候,對比著xml的內容,我們就可以操作DOC API相應的方法解析出相應數據了。
總結:DOM解析XML相對于SAX解析XML更加簡單,掌握XML DOC文檔樹結構是掌握DOM解析XML的重中之重,可以說掌握了XML文檔樹結構,DOM解析XML就非常簡單了,簡單地調用一些方法即可。
上面這篇文章由于個人理解及學習筆記總結,如果有理解錯的地方,歡迎大家指出,與君共勉,大家一起進步。
Demo下載地址:http://download.csdn.net/detail/ydxlt/9328835
總結
以上是生活随笔為你收集整理的XML解析(二),DOM解析XML的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 郭明錤预测苹果明年推出 24 英寸 iM
- 下一篇: XML解析(一),SAX解析XML