日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

xml解析之DOM

系統(tǒng) 2240 0

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


xml解析之DOM


更多文章、技術(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ì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 绿春县| 永康市| 固始县| 永平县| 平和县| 上杭县| 沾化县| 维西| 北川| 酉阳| 吉安县| 漠河县| 博客| 荆州市| 阜新市| 云浮市| 海宁市| 绥阳县| 大丰市| 岳池县| 手游| 南城县| 衡山县| 合川市| 乳源| 房山区| 肥乡县| 乌审旗| 图们市| 保靖县| 田东县| 京山县| 翁源县| 铁岭县| 伊宁市| 宁远县| 天长市| 景洪市| 博野县| 梧州市| 乌兰察布市|