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