1. 程式人生 > >操作xml資料——Dom解析(備忘)

操作xml資料——Dom解析(備忘)

一、概述:
用xml儲存資料,一般只適用於單機且資料量不大,安全級別低的情況。常用的xml解析技術,有DOM和SAX。

DOM技術

SAX技術

基於xml文件樹結構的解析;

適用於多次訪問的xml文件。

比較消耗資源。

基於事件的解析;

適用於大資料量的xml文件。

佔用資源少,記憶體消耗小。

二、DOMDocument 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節點(元素節點)的子節點(元素節點)集合: