操作xml資料——Dom解析(備忘)
一、概述:
用xml儲存資料,一般只適用於單機且資料量不大,安全級別低的情況。常用的xml解析技術,有DOM和SAX。
DOM技術 |
SAX技術 |
基於xml文件樹結構的解析; 適用於多次訪問的xml文件。 比較消耗資源。 |
基於事件的解析; 適用於大資料量的xml文件。 佔用資源少,記憶體消耗小。 |
二、DOM(Document Object Model)解析技術
1、DOM概述
DOM樹:
DOM解析:如下圖找尋這些節點,然後對這些節點進行相關操作,用這樣的思路操作xml檔案,我們就稱之為DOM解析。
在DOM介面規範中,有四個基本的介面:Document , Node ,NodeList以及NamedNodeMap。在這四個基本介面中,Document介面是對文件進行操作的入口,它是從Node介面繼承過來的。Node介面是其他大多數介面的父類,像Document,Element, Attribute, Text, Comment等介面都是從Node介面繼承過來的。NodeList介面是一個節點的集合,它包含了某個節點中的所有子節點。NamedNodeMap介面也是一個節點的集合,通過該介面,可以建立節點名和節點之間的一一對映關係,從而利用節點名可以直接訪問特定的節點。
2、Document
Document介面代表了整個xml/html文件,因此,它是整棵文件數的根,提供了對文件中的資料進行訪問和操作的入口。
常用方法 |
說明 |
getElementsByTagName(String tagName) |
按文件順序返回文件中指定標記名稱的所有元素集合 |
createElement(String tagName) |
建立指定標記名稱的元素 |
3、Node
常用方法 |
說明 |
NodeList getChildNodes() |
獲取該元素的所有子節點,返回為節點集合。 |
4、Element
常用方法 |
說明 |
String getTagName() |
元素名稱 |
5、Node與Element的區別:
Node表示文件樹中的任意一種型別節點,可以是元素節點、屬性節點或文字節點等多種節點;而Element則只表示Node節點中的元素節點,即Node是Element的父介面。
6、讀取xml檔案
使用DOM解析xml文件的步驟主要有:
(1)建立解析器工廠物件;
(2)由解析器工廠物件建立解析器物件;
(3)由解析器物件對指定xml檔案進行解析,構建相應DOM樹,建立Document物件;
(4)以Document物件為起點對DOM樹的節點進行增刪改查操作;
7、程式解釋:
(1)建立解析器工廠物件DocumentBuilderFactory;通過下列程式碼獲得:
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();我們建立解析器工廠物件是為了獲得解析器物件。當DocumentBuilderFactory類的靜態方法newInstance()被呼叫時,它根據一個系統變數來決定具體使用哪一個解析器。這個用了工廠模式。
(2)由解析器工廠物件建立解析器物件DocumentBuilder;通過下列程式碼獲得:
DocumentBuilder db=dbf.newDocumentBuilder();通過工廠物件的newDocumentBuilder()方法來獲得DocumentBuilder物件,這個物件代表了具體的DOM解析器。
(3)由解析器物件對指定xml檔案進行解析,構建相應DOM樹,建立Document物件。通過下列程式碼獲得:Document doc=db.parse(“C:/xml/message.xml”);
DocumentBuilder的parse()方法接受一個xml文件名作為輸入引數,返回一個Document物件,這個Document物件就代表了一個xml文件的樹模型。以後所有的對xml文件的操作,都與解析器無關,直接在這個Document物件上進行操作就可以了。而具體對Document操作的方法,就是由DOM所定義的了。
(4)從上面得到的Document物件開始,我們就可以進行DOM解析了。使用Document物件的getElementsByTagName()方法,得到一個NodeList物件,一個Node物件代表了一個xml文件中的一個標籤元素(元素節點),然後我們可以通過NodeList物件的item()方法來得到列表中的每一個Node物件。
v 怎麼獲得該元素節點的文字內容:
然後通過Node的getFirstChild().getNodeValue()來得到該元素節點的文字內容。
這個getFirstChild()方法必須加上,因為它主要和W3C對DOM的定義有關。
還有就是Brand節點下可能有子元素節點,或者其屬性,那麼又應該怎麼獲取其內容呢?
v 怎麼獲取Brand節點(元素節點)的屬性內容:
v 怎麼獲取Brand節點(元素節點)的子節點(元素節點)集合: