DOM 是 Document Object Model 的縮寫(xiě),即文檔對(duì)象模型。 XML 將數(shù)據(jù)組織為一顆樹(shù),所以 DOM 就是對(duì)這顆樹(shù)的一個(gè)對(duì)象描敘。通俗的說(shuō),就是通過(guò)解析 XML 文檔,為 XML 文檔在邏輯上建立一個(gè)樹(shù)模型,樹(shù)的節(jié)點(diǎn)是一個(gè)個(gè)對(duì)象。我們通過(guò)存取這些對(duì)象就能夠存取 XML 文檔的內(nèi)容。
下面我們來(lái)看一個(gè)簡(jiǎn)單的例子,看看在 DOM 中,我們是如何來(lái)操作一個(gè) XML 文檔的。
?
這是一個(gè) XML 文檔,也是我們要操作的對(duì)象:
?
<?xml version="1.0" encoding="UTF-8"?>
<messages>
<message>Good-bye serialization, hello Java!</message>
</messages>
?
下面,我們需要把這個(gè)文檔的內(nèi)容解析到一個(gè) Java 對(duì)象中去供程序使用,利用 JAXP ,我們只需幾行代碼就能做到這一點(diǎn)。首先,我們需要建立一個(gè)解析器工廠,以利用這個(gè)工廠來(lái)獲得一個(gè)具體的解析器對(duì)象:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
我們?cè)谶@里使用 DocumentBuilderFacotry 的目的是為了創(chuàng)建與具體解析器無(wú)關(guān)的程序,當(dāng) DocumentBuilderFactory 類(lèi)的靜態(tài)方法 newInstance() 被調(diào)用時(shí),它根據(jù)一個(gè)系統(tǒng)變量來(lái)決定具體使用哪一個(gè)解析器。又因?yàn)樗械慕馕銎鞫挤挠? JAXP 所定義的接口,所以無(wú)論具體使用哪一個(gè)解析器,代碼都是一樣的。所以當(dāng)在不同的解析器之間進(jìn)行切換時(shí),只需要更改系統(tǒng)變量的值,而不用更改任何代碼。這就是工廠所帶來(lái)的好處。這個(gè)工廠模式的具體實(shí)現(xiàn),可以參看下面的類(lèi)圖。
??
DocumentBuilder builder = factory.newDocumentBuilder();
當(dāng)獲得一個(gè)工廠對(duì)象后,使用它的靜態(tài)方法 newDocumentBuilder() 方法可以獲得一個(gè) DocumentBuilder 對(duì)象,這個(gè)對(duì)象代表了具體的 DOM 解析器。但具體是哪一種解析器,微軟的或者 IBM 的,對(duì)于程序而言并不重要。
?
API javax.xml.parsers.DocumentBuilderFactory 1.4
返回 DocumentBuilderFactory 類(lèi)的一個(gè)實(shí)例
static DocumentBuilderFactory newInstance()
返回 DocumentBuilder 類(lèi)的一個(gè)實(shí)例
DocumentBuilder newDocumentBuilder()
?
然后,我們就可以利用這個(gè)解析器來(lái)對(duì) XML 文檔進(jìn)行解析了:
Document doc = builder.parse("src/message.xml");
?
DocumentBuilder 的 parse() 方法接受一個(gè) XML 文檔名作為輸入?yún)?shù),返回一個(gè) Document 對(duì)象,這個(gè) Document 對(duì)象就代表了一個(gè) XML 文檔的樹(shù)模型。以后所有的對(duì) XML 文檔的操作,都與解析器無(wú)關(guān),直接在這個(gè) Document 對(duì)象上進(jìn)行操作就可以了。而具體對(duì) Document 操作的方法,就是由 DOM 所定義的了。
?
API javax.xml.parsers.DocumentBuilder 1.4
解析來(lái)自給定文件、 URL 或輸入流的 XML 文檔,返回解析后的文檔
-
Document parse(File f)
-
Document parse(String url)
-
Document parse(InputStream in)
JAXP 支持 W3C 所推薦的 DOM 2 。如果你對(duì) DOM 很熟悉,只需要按照 DOM 的規(guī)范來(lái)進(jìn)行方法調(diào)用就可以。 DOM 是用來(lái)描敘 XML 文檔中的數(shù)據(jù)的模型,引入 DOM 的全部原因就是為了用這個(gè)模型來(lái)操作 XML 文檔的中的數(shù)據(jù)。 DOM 規(guī)范中定義有節(jié)點(diǎn)(即對(duì)象)、屬性和方法,我們通過(guò)這些節(jié)點(diǎn)的存取來(lái)存取 XML 的數(shù)據(jù)。
上面得到了 Document 對(duì)象,使用它的 getElementsByTagName() 方法,我們可以得到一個(gè) NodeList 對(duì)象,一個(gè) Node 對(duì)象代表了一個(gè) XML 文檔中的一個(gè)標(biāo)簽元素,而 NodeList 對(duì)象,觀其名而知其意,所代表的是一個(gè) Node 對(duì)象的列表:
NodeList children = doc.getElementsByTagName("message");
我們通過(guò)這樣一條語(yǔ)句所得到的是 XML 文檔中所有 <message> 標(biāo)簽對(duì)應(yīng)的 Node 對(duì)象的一個(gè)列表。然后,我們可以使用 NodeList 對(duì)象的 item() 方法來(lái)得到列表中的每一個(gè) Node 對(duì)象:
Node child = children.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 = child.getFirstChild().getNodeValue();
注意: 這里還使用了一個(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)用程序。
DOM 的基本對(duì)象有 5 個(gè): Document , Node , NodeList , Element 和 Attr 。如下結(jié)構(gòu)圖。
?
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ì)象。它所包含的主要的方法有:
API org.w3c.dom.Document
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ì)象所包含的主要的方法有:
API org.w3c.dom.Node
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ì)等的,還有 getLastChild() 方法返回最后一個(gè)子節(jié)點(diǎn)。
?
getNextSibling() : 返回在 DOM 樹(shù)中這個(gè)節(jié)點(diǎn)的下一個(gè)兄弟節(jié)點(diǎn),對(duì)等的,還有 getPreviousSibling() 方法返回其前一個(gè)兄弟節(jié)點(diǎn)。
?
getNodeName() : 根據(jù)節(jié)點(diǎn)的類(lèi)型返回節(jié)點(diǎn)的名稱。
?
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ì)象。
?
NodeList 對(duì)象,顧名思義,就是代表了一個(gè)包含了一個(gè)或者多個(gè) Node 的列表。可以簡(jiǎn)單的把它看成一個(gè) Node 的數(shù)組,我們可以通過(guò)方法來(lái)獲得列表中的元素:
?
API org.w3c.dom. NodeList
GetLength() : 返回列表的長(zhǎng)度。
Item(int) : 返回指定位置的 Node 對(duì)象。
?
Element 對(duì)象代表的是 XML 文檔中的標(biāo)簽元素,繼承于 Node ,亦是 Node 的最主要的子對(duì)象。在標(biāo)簽中可以包含有屬性,因而 Element 對(duì)象中有存取其屬性的方法,而任何 Node 中定義的方法,也可以用在 Element 對(duì)象上面。
API org.w3c.dom. Element
getElementsByTagName(String) : 返回一個(gè) NodeList 對(duì)象,它包含了在這個(gè)標(biāo)簽中其下的子孫節(jié)點(diǎn)中具有給定標(biāo)簽名字的標(biāo)簽。
?
getTagName() : 返回一個(gè)代表這個(gè)標(biāo)簽名字的字符串。
?
getAttribute(String) : 返回標(biāo)簽中給定屬性名稱的屬性的值。在這兒需要主要的是,應(yīng)為 XML 文檔中允許有實(shí)體屬性出現(xiàn),而這個(gè)方法對(duì)這些實(shí)體屬性并不適用。這時(shí)候需要用到 getAttributeNodes() 方法來(lái)得到一個(gè) Attr 對(duì)象來(lái)進(jìn)行進(jìn)一步的操作。
?
getAttributeNode(String) : 返回一個(gè)代表給定屬性名稱的 Attr 對(duì)象。
?
Attr 對(duì)象代表了某個(gè)標(biāo)簽中的屬性。 Attr 繼承于 Node ,但是因?yàn)? Attr 實(shí)際上是包含在 Element 中的,它并不能被看作是 Element 的子對(duì)象,因而在 DOM 中 Attr 并不是 DOM 樹(shù)的一部分,所以 Node 中的 getparentNode() , getpreviousSibling() 和 getnextSibling() 返回的都將是 null 。也就是說(shuō), Attr 其實(shí)是被看作包含它的 Element 對(duì)象的一部分,它并不作為 DOM 樹(shù)中單獨(dú)的一個(gè)節(jié)點(diǎn)出現(xiàn)。這一點(diǎn)在使用的時(shí)候要同其它的 Node 子對(duì)象相區(qū)別。
?
需要說(shuō)明的是,上面所說(shuō)的 DOM 對(duì)象在 DOM 中都是用接口定義的,在定義的時(shí)候使用的是與具體語(yǔ)言無(wú)關(guān)的 IDL 語(yǔ)言來(lái)定義的。因而, DOM 其實(shí)可以在任何面向?qū)ο蟮恼Z(yǔ)言中實(shí)現(xiàn),只要它實(shí)現(xiàn)了 DOM 所定義的接口和功能就可以了。同時(shí),有些方法在 DOM 中并沒(méi)有定義,是用 IDL 的屬性來(lái)表達(dá)的,當(dāng)被映射到具體的語(yǔ)言時(shí),這些屬性被映射為相應(yīng)的方法。
<?xml version="1.0" encoding="UTF-8"?> <links> <link> <text>The makers of Java</text> <url newWindow="no">http://java.sun.com</url> <author>Sun Microsystems</author> <date> <day>5</day> <month>4</month> <year>2008</year> </date> <description>Sun Microsystem's website.</description> </link> <link> <text>Janwer's Homepage</text> <url>www.janwer.com</url> <author>張峻偉</author> <date> <day>5</day> <month>3</month> <year>2008</year> </date> <description> A site from Janwer Zhang, give u lots of suprise!!! </description> </link> <link> <text>張峻偉的個(gè)人主頁(yè)</text> <url>janwer.iteye.com</url> <author>張峻偉</author> <date> <day>5</day> <month>3</month> <year>2008</year> </date> <description>有關(guān)J2EE</description> </link> <link> <text>zhang janwer's Homepage</text> <url>www.junwei.com</url> <author>janwer zhang</author> <date> <day>6</day> <month>3</month> <year>2008</year> </date> <description>A site from J2EE,C#,C++,C and so on!</description> </link> </links>
?
我們希望在一個(gè)名為 server.xml 文件中保存了一些 URL 地址,通過(guò)一個(gè)簡(jiǎn)單的程序,我們可以通過(guò) DOM 把這些 URL 讀出并顯示出來(lái),也可以反過(guò)來(lái)向這個(gè) XML 文件中寫(xiě)入加入的 URL 地址。
package cn.janwer.xml; import javax.xml.parsers.*; import org.w3c.dom.*; public class XmlRead { public static void main(String args[]) { try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse("src/server.xml"); doc.normalize(); //以去掉XML文檔中作為格式化內(nèi)容的空白 /** * XML文檔中的空白符也會(huì)被作為對(duì)象映射在DOM樹(shù)中。 * 因而,直接調(diào)用Node方法的 getChildNodes方法有時(shí)候會(huì)有些問(wèn)題, * 有時(shí)不能夠返回所期望的NodeList對(duì)象。 * 解決的辦法是使用Element的 getElementByTagName(String), * 返回的NodeLise就是所期待的對(duì)象了。然后,可以用item()方法提取想要的元素。 */ NodeList links = doc.getElementsByTagName("link"); for (int i = 0; i < links.getLength(); i++) { Element link = (Element) links.item(i); System.out.print("Content: "); System.out.println(link.getElementsByTagName("text").item(0) .getFirstChild().getNodeValue()); System.out.print("URL: "); System.out.println(link.getElementsByTagName("url").item(0) .getFirstChild().getNodeValue()); System.out.print("Author: "); System.out.println(link.getElementsByTagName("author").item(0) .getFirstChild().getNodeValue()); System.out.print("Date: "); Element linkdate = (Element) link.getElementsByTagName("date") .item(0); String day = linkdate.getElementsByTagName("day").item(0) .getFirstChild().getNodeValue(); String month = linkdate.getElementsByTagName("month").item(0) .getFirstChild().getNodeValue(); String year = linkdate.getElementsByTagName("year").item(0) .getFirstChild().getNodeValue(); System.out.println(day + "-" + month + "-" + year); System.out.print("Description: "); System.out.println(link.getElementsByTagName("description") .item(0).getFirstChild().getNodeValue().trim()); System.out.println(); } } catch (Exception e) { e.printStackTrace(); } } }
?
下面的內(nèi)容,就是在修改了 DOM 樹(shù)后重新寫(xiě)入到 XML 文檔中去的問(wèn)題了。這個(gè)程序名為 Xmlwrite.java 。在 JAXP1.0 版本中,并沒(méi)有直接的類(lèi)和方法能夠處理 XML 文檔的寫(xiě)入問(wèn)題,需要借助其它包中的一些輔助類(lèi)。而在 JAXP1.1 版本中,引入了對(duì) XSLT 的支持,所謂 XSLT ,就是對(duì) XML 文檔進(jìn)行變換( Translation )后,得到一個(gè)新的文檔結(jié)構(gòu)。利用這個(gè)新加入的功能,我們就能夠很方便的把新生成或者修改后的 DOM 樹(shù)從新寫(xiě)回到 XML 文件中去了,下面我們來(lái)看看代碼的實(shí)現(xiàn),這段代碼的主要功能是向 links.xml 文件中加入一個(gè)新的 link 節(jié)點(diǎn)。
?
我們希望在上面的 XML 文件中加入一個(gè)新的 link 節(jié)點(diǎn),因而首先還是要讀入 links.xml 文件,構(gòu)建一個(gè) DOM 樹(shù),然后再對(duì)這個(gè) DOM 樹(shù)進(jìn)行修改(添加節(jié)點(diǎn)),最后把修改后的 DOM 寫(xiě)回到 links.xml 文件中:
DocumentBuilderFactory factory = DocumentBuilderFactory. newInstance ();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse("src/server.xml");
doc.normalize();
// --- 取得變量 ----
String text = "zhang janwer's Homepage";
String url = "www.junwei.com";
String author = "janwer zhang";
String discription = "A site from J2EE,C#,C++,C and so on!";
為了看清重點(diǎn),簡(jiǎn)化程序,我們把要加入的內(nèi)容硬編碼到記憶 String 對(duì)象中,而實(shí)際操作中,往往利用一個(gè)界面來(lái)提取用戶輸入,或者通過(guò) JDBC 從數(shù)據(jù)庫(kù)中提取想要的內(nèi)容。
Text textseg;
Element link=doc.createElement("link");
?
首先應(yīng)該明了的是,無(wú)論什么類(lèi)型的 Node , Text 型的也好, Attr 型的也好, Element 型的也好,它們的創(chuàng)建都是通過(guò) Document 對(duì)象中的 createXXX() 方法來(lái)創(chuàng)建的( XXX 代表具體要?jiǎng)?chuàng)建的類(lèi)型)。
創(chuàng)建節(jié)點(diǎn)的過(guò)程可能有些千篇一律,但需要注意的地方是,對(duì) Element 中所包含的 text (在 DOM 中,這些 text 也是代表了一個(gè) Node 的,因此也必須為它們創(chuàng)建相應(yīng)的 node ),不能直接用 Element 對(duì)象的 setNodeValue() 方法來(lái)設(shè)置這些 text 的內(nèi)容,而需要用創(chuàng)建的 Text 對(duì)象的 setNodeValue() 方法來(lái)設(shè)置文本,這樣才能夠把創(chuàng)建的 Element 和其文本內(nèi)容添加到 DOM 樹(shù)中。看看前面的代碼,你會(huì)更好的理解這一點(diǎn):
doc.getDocumentElement().appendChild(link);
最后,不要忘記把創(chuàng)建好的節(jié)點(diǎn)添加到 DOM 樹(shù)中。 Document 類(lèi)的 getDocumentElement() 方法,返回代表文檔根節(jié)點(diǎn)的 Element 對(duì)象。在 XML 文檔中,根節(jié)點(diǎn)一定是唯一的。
TransformerFactory tFactory =TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new java.io.File("links.xml"));
transformer.transform(source, result);
?
然后就是用 XSLT 把 DOM 樹(shù)輸出了。這里的 TransformerFactory 也同樣應(yīng)用了工廠模式,使得具體的代碼同具體的變換器無(wú)關(guān)。實(shí)現(xiàn)的方法和 DocumentBuilderFactory 相同,這兒就不贅述了。 Transformer 類(lèi)的 transfrom 方法接受兩個(gè)參數(shù)、一個(gè)數(shù)據(jù)源 Source 和一個(gè)輸出目標(biāo) Result 。這里分別使用的是 DOMSource 和 StreamResult ,這樣就能夠把 DOM 的內(nèi)容輸出到一個(gè)輸出流中,當(dāng)這個(gè)輸出流是一個(gè)文件的時(shí)候, DOM 的內(nèi)容就被寫(xiě)入到文件中去了。
package cn.janwer.xml; import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.*; public class Xmlwriter { public static void main(String args[]) { try { DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse("src/server.xml"); doc.normalize(); // ---取得變量---- String text = "zhang janwer's Homepage"; String url = "www.junwei.com"; String author = "janwer zhang"; String discription = "A site from J2EE,C#,C++,C and so on!"; // ------------- Text textseg; Element link = doc.createElement("link"); Element linktext = doc.createElement("text"); textseg = doc.createTextNode(text); linktext.appendChild(textseg); link.appendChild(linktext); Element linkurl = doc.createElement("url"); textseg = doc.createTextNode(url); linkurl.appendChild(textseg); link.appendChild(linkurl); Element linkauthor = doc.createElement("author"); textseg = doc.createTextNode(author); linkauthor.appendChild(textseg); link.appendChild(linkauthor); java.util.Calendar rightNow = java.util.Calendar.getInstance(); String day = Integer.toString(rightNow.get(java.util.Calendar.DAY_OF_MONTH)); String month = Integer.toString(rightNow.get(java.util.Calendar.MONTH)); String year = Integer.toString(rightNow.get(java.util.Calendar.YEAR)); Element linkdate = doc.createElement("date"); Element linkdateday = doc.createElement("day"); textseg = doc.createTextNode(day); linkdateday.appendChild(textseg); Element linkdatemonth = doc.createElement("month"); textseg = doc.createTextNode(month); linkdatemonth.appendChild(textseg); Element linkdateyear = doc.createElement("year"); textseg = doc.createTextNode(year); linkdateyear.appendChild(textseg); linkdate.appendChild(linkdateday); linkdate.appendChild(linkdatemonth); linkdate.appendChild(linkdateyear); link.appendChild(linkdate); Element linkdiscription = doc.createElement("description"); textseg = doc.createTextNode(discription); linkdiscription.appendChild(textseg); link.appendChild(linkdiscription); doc.getDocumentElement().appendChild(link); TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer = tFactory.newTransformer(); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult( new java.io.File("src/server.xml")); transformer.transform(source, result); } catch (Exception e) { e.printStackTrace(); } } }
?
編輯 XML 文檔總結(jié):
?? 1. 更改節(jié)點(diǎn)數(shù)據(jù)
???? Node.setNodeValue(elemValue);
?
?? 2. 添加節(jié)點(diǎn)
???? String totalString = new Double(total).toString();
????? ??? Node totalNode = doc.createTextNode(totalString); ?
????? ??? //Document 對(duì)象創(chuàng)建新的文本節(jié)點(diǎn),該節(jié)點(diǎn)帶有作為值的 totalString
????? ??? Element totalElement = doc.createElement("total");
????? ??? // 創(chuàng)建新元素 total
????? ??? totalElement.appendChild(totalNode); ????????????????????????
????? ??? // 將節(jié)點(diǎn)添加到新的 total 元素。
????? ??? thisOrder.insertBefore(totalElement, thisOrder.getFirstChild());
???? // 將新元素添加到 Document ,指定新的 Node ,然后指定新 Node 在 Node 之前
????? ??
?? 3. 除去節(jié)點(diǎn)
???? Node deadNode = thisOrderItem.getParentNode().removeChild(thisOrderItem);
?
?? 4. 替換節(jié)點(diǎn)
???? Element backElement = doc.createElement("backordered"); ????
????? ??? // 創(chuàng)建新元素 backordered
????? ??? Node deadNode = thisOrderItem.getParentNode().replaceChild(backElement,thisOrderItem);
????? ??
?? 5. 創(chuàng)建和設(shè)置屬性
???? Element backElement = doc.createElement("backordered"); ????
????? ??? // 創(chuàng)建新元素 backordered
????? ??? backElement.setAttributeNode(doc.createAttribute("itemid"));
????? ??? // 創(chuàng)建新屬性 itemid
????? ??? String itemIdString = thisOrderItem.getAttributeNode("itemid").getNodeValue();
????? ??? // 取得 thisOrderItem 的屬性 itemid 的值
????? ??? backElement.setAttribute("itemid", itemIdString);
????? ??? // 設(shè)置 backElement 的屬性 item 的值 , 可以省略 createAttribute
????? ??? Node deadNode = thisOrderItem.getParentNode().replaceChild(backElement,thisOrderItem);
?
?? 6. 除去屬性
???? Element thisOrder = (Element)orders.item(orderNum);
????? ??? Element customer = (Element)thisOrder.getElementsByTagName("cusomertid").item(0);
????? ??? customer.removeAttribute("limit");
????? ??? // 去除屬性 limit
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
