從上面得到的Document對象開始,我們就可以開始我們的DOM之旅了。使用Document對象的getElementsByTagName()方法,我們可以得到一個NodeList對象,一個Node對象代表了一個XML文檔中的一個標簽元素,而NodeList對象,觀其名而知其意,所代表的是一個Node對象的列表:
NodeList nl = doc.getElementsByTagName("message");
我們通過這樣一條語句所得到的是XML文檔中所有標簽對應(yīng)的Node對象的一個列表。然后,我們可以使用NodeList對象的item()方法來得到列表中的每一個Node對象:
Node my_node = nl.item(0);
當(dāng)一個Node對象被建立之后,保存在XML文檔中的數(shù)據(jù)就被提取出來并封裝在這個Node中了。在這個例子中,要提取Message標簽內(nèi)的內(nèi)容,我們通常會使用Node對象的getNodeValue()方法:
String message = my_node.getFirstChild().getNodeValue();
請注意,這里還使用了一個getFirstChild()方法來獲得message下面的第一個子Node對象。雖然在message標簽下面除了文本外并沒有其它子標簽或者屬性,但是我們堅持在這里使用getFirseChild()方法,這主要和W3C對DOM的定義有關(guān)。W3C把標簽內(nèi)的文本部分也定義成一個Node,所以先要得到代表文本的那個Node,我們才能夠使用getNodeValue()來獲取文本的內(nèi)容。
現(xiàn)在,既然我們已經(jīng)能夠從XML文件中提取出數(shù)據(jù)了,我們就可以把這些數(shù)據(jù)用在合適的地方,來構(gòu)筑應(yīng)用程序。
下面的內(nèi)容,我們將更多的關(guān)注DOM,為DOM作一個較為詳細的解析,使我們使用起來更為得心應(yīng)手。
DOM詳解
1.基本的DOM對象
DOM的基本對象有5個:Document,Node,NodeList,Element和Attr。下面就這些對象的功能和實現(xiàn)的方法作一個大致的介紹。
Document對象代表了整個XML的文檔,所有其它的Node,都以一定的順序包含在Document對象之內(nèi),排列成一個樹形的結(jié)構(gòu),程序員可以通過遍歷這顆樹來得到XML文檔的所有的內(nèi)容,這也是對XML文檔操作的起點。我們總是先通過解析XML源文件而得到一個Document對象,然后再來執(zhí)行后續(xù)的操作。此外,Document還包含了創(chuàng)建其它節(jié)點的方法,比如createAttribut()用來創(chuàng)建一個Attr對象。它所包含的主要的方法有:
createAttribute(String):用給定的屬性名創(chuàng)建一個Attr對象,并可在其后使用setAttributeNode方法來放置在某一個Element對象上面。
createElement(String):用給定的標簽名創(chuàng)建一個Element對象,代表XML文檔中的一個標簽,然后就可以在這個Element對象上添加屬性或進行其它的操作。
createTextNode(String):用給定的字符串創(chuàng)建一個Text對象,Text對象代表了標簽或者屬性中所包含的純文本字符串。如果在一個標簽內(nèi)沒有其它的標簽,那么標簽內(nèi)的文本所代表的Text對象是這個Element對象的唯一子對象。
getElementsByTagName(String):返回一個NodeList對象,它包含了所有給定標簽名字的標簽。
getDocumentElement():返回一個代表這個DOM樹的根節(jié)點的Element對象,也就是代表XML文檔根元素的那個對象。
Node對象是DOM結(jié)構(gòu)中最為基本的對象,代表了文檔樹中的一個抽象的節(jié)點。在實際使用的時候,很少會真正的用到Node這個對象,而是用到諸如Element、Attr、Text等Node對象的子對象來操作文檔。Node對象為這些對象提供了一個抽象的、公共的根。雖然在Node對象中定義了對其子節(jié)點進行存取的方法,但是有一些Node子對象,比如Text對象,它并不存在子節(jié)點,這一點是要注意的。Node對象所包含的主要的方法有:
appendChild(org.w3c.dom.Node):為這個節(jié)點添加一個子節(jié)點,并放在所有子節(jié)點的最后,如果這個子節(jié)點已經(jīng)存在,則先把它刪掉再添加進去。
getFirstChild():如果節(jié)點存在子節(jié)點,則返回第一個子節(jié)點,對等的,還有g(shù)etLastChild()方法返回最后一個子節(jié)點。
getNextSibling():返回在DOM樹中這個節(jié)點的下一個兄弟節(jié)點,對等的,還有g(shù)etPreviousSibling()方法返回其前一個兄弟節(jié)點。
getNodeName():根據(jù)節(jié)點的類型返回節(jié)點的名稱。
getNodeType():返回節(jié)點的類型。
getNodeValue():返回節(jié)點的值。
hasChildNodes():判斷是不是存在有子節(jié)點。
hasAttributes():判斷這個節(jié)點是否存在有屬性。
getOwnerDocument():返回節(jié)點所處的Document對象。
insertBefore(org.w3c.dom.Node new,org.w3c.dom.Node ref):在給定的一個子對象前再插入一個子對象。
removeChild(org.w3c.dom.Node):刪除給定的子節(jié)點對象。
replaceChild(org.w3c.dom.Node new,org.w3c.dom.Node old):用一個新的Node對象代替給定的子節(jié)點對象。
相關(guān)推薦:北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |