第8章 DOM解析器電子課件_第1頁(yè)
第8章 DOM解析器電子課件_第2頁(yè)
第8章 DOM解析器電子課件_第3頁(yè)
第8章 DOM解析器電子課件_第4頁(yè)
第8章 DOM解析器電子課件_第5頁(yè)
已閱讀5頁(yè),還剩30頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第8章DOM解析器8.1DOM解析器8.2節(jié)點(diǎn)的類型8.3Document節(jié)點(diǎn)8.4Element節(jié)點(diǎn)8.5Text節(jié)點(diǎn)8.6CDATASection節(jié)點(diǎn)第8章DOM解析器8.7Attr節(jié)點(diǎn)8.8DocumentType節(jié)點(diǎn)8.9處理空白8.10驗(yàn)證規(guī)范性和有效性8.11使用DOM生成XML文件8.12XML與JSP的結(jié)合基于DOM的解析器稱為DOM解析器。DOM解析器解析XML文件的最大特點(diǎn)是把整個(gè)XML文件全部加載到內(nèi)存中,在內(nèi)存中形成一個(gè)與XML文件結(jié)構(gòu)相對(duì)應(yīng)的節(jié)點(diǎn)樹。然后依據(jù)節(jié)點(diǎn)的子孫關(guān)系來(lái)遍歷數(shù)據(jù)。通過(guò)DOM解析器處理XML文件效率高,但是,十分消耗系統(tǒng)的資源,比較適合復(fù)雜但相對(duì)較小的文件。

8.1DOM解析器8.1.1DOM標(biāo)準(zhǔn)8.1.2認(rèn)識(shí)DOM解析器返回DOM標(biāo)準(zhǔn)DOM是DocumentObjectModel文檔對(duì)象模型的縮寫,是W3C制定的一套規(guī)范。依據(jù)DOM規(guī)范(/DOM/),DOM是一種與瀏覽器、平臺(tái)、語(yǔ)言無(wú)關(guān)的接口。各種語(yǔ)言可以按照DOM規(guī)范去實(shí)現(xiàn)這些接口,給出解析文件的解析器。DOM規(guī)范中所指的文件相當(dāng)廣泛,其中包括XML文件以及HTML文件。DOM有3個(gè)版本:

Level:包括對(duì)XML1.0和HTML的支持,每個(gè)HTML元素被表示為一個(gè)接口。它包括用于添加、編輯、移動(dòng)和讀取節(jié)點(diǎn)中包含的信息的方法等。Level2:包括了更廣泛的W3C推薦技術(shù),比如層疊樣式表(CSS)和

名稱空間(XMLNamespaces),允許開發(fā)人員檢測(cè)和使用可能適用于某個(gè)節(jié)點(diǎn)的名稱空間信息。Level2還支持W3C所謂的“事件”,比如一個(gè)文件能對(duì)諸如鼠標(biāo)移動(dòng)之類的“事件”做出反應(yīng)。

Level3:包括對(duì)創(chuàng)建Document對(duì)象(以前的版本將這個(gè)任務(wù)留給實(shí)現(xiàn),使得創(chuàng)建通用應(yīng)用程序很困難)的更好支持、增強(qiáng)的名稱空間支持,以及用來(lái)處理文檔加載和保存、驗(yàn)證以及XPath的新模塊;XPath是在XSL轉(zhuǎn)換(XSLTransformation)以及其他XML技術(shù)中用來(lái)選擇節(jié)點(diǎn)的手段。

返回認(rèn)識(shí)DOM解析器(1)本書主要介紹Sun公司的DOM解析器,該解析器是支持Level3的解析器。注意區(qū)分DOM解析器、JDOM和DOM4J。Sun公司發(fā)布的SDK1.5中包含了DOM解析器解析XML文件所需要的API(JavaAPIforXMLParsing,JAXP),JAXP實(shí)現(xiàn)了DOM規(guī)范的Java語(yǔ)言綁定。SDK1.5可以在Sun公司網(wǎng)站()上免費(fèi)下載。在JAXP中,DOM解析器是一個(gè)DocumentBuilder類的實(shí)例,下面介紹一下如何創(chuàng)建一個(gè)DOM解析器。

認(rèn)識(shí)DOM解析器(2)(1)建立一個(gè)解析器工廠,利用這個(gè)工廠來(lái)獲得一個(gè)具體的解析器對(duì)象:DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();DocumentBuilderbuilder=factory.newDocumentBuilder();使用DocumentBuilderFacotry的目的是為了創(chuàng)建與具體解析器無(wú)關(guān)的程序,當(dāng)DocumentBuilderFactory類的靜態(tài)方法newInstance()被調(diào)用時(shí),它根據(jù)一個(gè)系統(tǒng)變量來(lái)決定具體使用哪一個(gè)解析器。(2)factory對(duì)象調(diào)用它的靜態(tài)方法newDocumentBuilder()獲得一個(gè)DocumentBuilder對(duì)象,這個(gè)對(duì)象就是DOM解析器。認(rèn)識(shí)DOM解析器(3)當(dāng)獲得一個(gè)builder對(duì)象(DOM解析器)之后,就可以調(diào)用該對(duì)象的publicDocumentparse(Filefile)方法來(lái)解析文件。解析的內(nèi)容以對(duì)象的形式返回,該對(duì)象是實(shí)現(xiàn)了Document接口的一個(gè)實(shí)例,稱為Document對(duì)象。

Documentdocument=builder.parse(newFile("01.xml"));

builder對(duì)象除了調(diào)用publicDocumentparse(Filefile)方法解析文件外,還可以調(diào)用其它兩個(gè)方法:

publicDocumentparse(InputStreamin)publicDocumentparse(Stringuri)

返回8.2節(jié)點(diǎn)的類型8.2.1Node接口8.2.2NodeList接口8.2.3NamedNodeMap接口Document節(jié)點(diǎn)Element節(jié)點(diǎn)DocumentType節(jié)點(diǎn)Element節(jié)點(diǎn)Text節(jié)點(diǎn)CDATASection節(jié)點(diǎn)返回Node接口(1)DOM規(guī)范中很多接口都是從Node接口繼承而來(lái),在DOM規(guī)范中把XML文件的每一個(gè)標(biāo)記、屬性、注釋、文本內(nèi)容等都看作節(jié)點(diǎn)。一個(gè)Node對(duì)象代表了一個(gè)類型的節(jié)點(diǎn)。DOM規(guī)范中,不同類型的節(jié)點(diǎn)采用不同的整數(shù)加以區(qū)分。為了保證日后能夠容易地對(duì)節(jié)點(diǎn)類型進(jìn)行擴(kuò)充,W3C保留了1~200之間的整數(shù),作為不同節(jié)點(diǎn)類型的定義。具體對(duì)應(yīng)關(guān)系見下表:節(jié)點(diǎn)類型對(duì)應(yīng)的整數(shù)表示常量標(biāo)記節(jié)點(diǎn)(Element)1ELEMENT_NODE屬性節(jié)點(diǎn)(Attr)2ATTRIBUTE_NODE文本節(jié)點(diǎn)(Text)3TEXT_NODECDATA節(jié)點(diǎn)(CDATASection)4CDATA_SECTION_NODE實(shí)體引用節(jié)點(diǎn)(EntityReference)5ENTITY_REFERENCE_NODE實(shí)體節(jié)點(diǎn)(Entity)6ENTITY_NODE處理指令節(jié)點(diǎn)(ProcessingInstruction)7PROCESSING_INSTRUCTION_NODEComment節(jié)點(diǎn)8COMMENT_NODEDocument節(jié)點(diǎn)9DOCUMENT_NODE文檔類型節(jié)點(diǎn)(DocumentType)10DOCUMENT_TYPE_NODE文檔片段節(jié)點(diǎn)(DocumentFragment)11DOCUMENT_FRAGMENT_NODENotation節(jié)點(diǎn)12NOTATION_NODENode接口(2)Node接口定義了所有類型的節(jié)點(diǎn)都具有的屬性和方法。見下表:方法功能描述getNodeName()獲取當(dāng)前節(jié)點(diǎn)的名稱getNodeValue()獲取當(dāng)前節(jié)點(diǎn)的值setNodeValue(Stringarg)設(shè)置當(dāng)前節(jié)點(diǎn)的值getNodeType()獲取當(dāng)前節(jié)點(diǎn)的類型getChildNodes()獲取當(dāng)前節(jié)點(diǎn)的所有子節(jié)點(diǎn),返回NodeList對(duì)象getFirstChild()獲取當(dāng)前節(jié)點(diǎn)的第一個(gè)子節(jié)點(diǎn)getLastChild()獲取當(dāng)前節(jié)點(diǎn)的最后一個(gè)子節(jié)點(diǎn)getPreviousSibling()獲取當(dāng)前節(jié)點(diǎn)的前一個(gè)兄弟節(jié)點(diǎn)getNextSibling()獲取當(dāng)前節(jié)點(diǎn)的后一個(gè)兄弟節(jié)點(diǎn)getparentNode()獲取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)getAttributes()獲得當(dāng)前節(jié)點(diǎn)的所有屬性,返回NamedNodeMap對(duì)象appendChild(Nodearg)在當(dāng)前節(jié)點(diǎn)的所有子節(jié)點(diǎn)之后添加新節(jié)點(diǎn)arghasChildNodes()判斷當(dāng)前節(jié)點(diǎn)是否有子節(jié)點(diǎn)insertBefore(Nodearg1,Nodearg2)把節(jié)點(diǎn)arg2插入到當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)arg1之前removeChild(Nodearg)從當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)中刪除arg節(jié)點(diǎn)replaceChild(Nodearg1,Nodearg2)用arg2節(jié)點(diǎn)替換當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)arg1getNamespaceURI()獲得Namespace的URIhasAttributes()判斷當(dāng)前節(jié)點(diǎn)是否具有屬性getTextContent()獲取當(dāng)前節(jié)點(diǎn)的文本內(nèi)容isSameNode(Nodearg)判斷當(dāng)前節(jié)點(diǎn)與arg是否是同一個(gè)節(jié)點(diǎn)isEqualNode(Nodearg)判斷當(dāng)前節(jié)點(diǎn)與arg是否相等返回NodeList接口

NodeList接口提供了對(duì)節(jié)點(diǎn)集合的抽象定義,用于表示有順序關(guān)系的一組節(jié)點(diǎn)。NodeList中的每一個(gè)節(jié)點(diǎn)都可以通過(guò)索引來(lái)訪問(wèn),索引值0表示第一個(gè)節(jié)點(diǎn)。NodeList接口有兩個(gè)常用的方法,見下表:方法名稱功能描述getLength()返回NodeList的長(zhǎng)度item(intindex)返回第index個(gè)節(jié)點(diǎn)返回NamedNodeMap接口通過(guò)NamedNodeMap接口中的方法可以方便地對(duì)標(biāo)記的屬性進(jìn)行維護(hù)和管理。NamedNodeMap中常用的方法見下表:方法名稱功能描述getLength()標(biāo)記中所包含的屬性個(gè)數(shù)item(intindex)屬性集合中的第index個(gè)屬性getNameItem(Nodearg)獲得指定名稱的節(jié)點(diǎn)setNameItem(Nodearg)設(shè)置指定名稱的節(jié)點(diǎn),如果節(jié)點(diǎn)不存在,就添加一個(gè)新節(jié)點(diǎn)removeNameItem(Nodearg)刪除指定名稱的節(jié)點(diǎn)getNameItemNS(StringnamespaceURI,Stringlocalname)獲得指定名稱空間和指定名稱的節(jié)點(diǎn)setNameItemNS(StringnamespaceURI,Stringlocalname)覆蓋指定名稱空間和指定名稱的節(jié)點(diǎn),如果節(jié)點(diǎn)不存在,就添加一個(gè)新節(jié)點(diǎn)返回8.3Document節(jié)點(diǎn)(1)Document節(jié)點(diǎn)代表了整個(gè)XML文件,XML文件的所有內(nèi)容都被封裝在一個(gè)Document節(jié)點(diǎn)內(nèi)。Document對(duì)象提供了對(duì)文檔中數(shù)據(jù)進(jìn)行訪問(wèn)的入口,應(yīng)用程序可以從該節(jié)點(diǎn)的子孫節(jié)點(diǎn)中獲得整個(gè)XML文件的數(shù)據(jù)。

Document類型節(jié)點(diǎn)的兩個(gè)子節(jié)點(diǎn)類型是DocumentType類型和Element類型。

Document節(jié)點(diǎn)常用的方法見下表:方法功能描述getDocumentElement()返回當(dāng)前節(jié)點(diǎn)的Element節(jié)點(diǎn)getDoctype()返回當(dāng)前節(jié)點(diǎn)的DocumentType子節(jié)點(diǎn)getElementByTagName(Stringname)返回一個(gè)NodeList對(duì)象,該對(duì)象由參數(shù)name指定的節(jié)點(diǎn)的Element類型子孫節(jié)點(diǎn)組成。getElementByTagNameNS(StringnamespaceURI,Stringlocalname)返回一個(gè)NodeList對(duì)象,該對(duì)象由參數(shù)localname指定的節(jié)點(diǎn)的Element類型子孫節(jié)點(diǎn)組成,localname的名稱空間由參數(shù)namespaceURI指定8.3Document節(jié)點(diǎn)(2)Document節(jié)點(diǎn)常用的方法續(xù)表方法功能描述getElementById(Stringid)方法,返回一個(gè)NodeList對(duì)象,該對(duì)象由給定ID的節(jié)點(diǎn)的Element類型子孫節(jié)點(diǎn)組成getXmlEncoding()返回XML文件使用的編碼getInputEncoding()返回輸入編碼getXmlStandalone()返回XML文件聲明中的standalone屬性的值getXmlVersion()返回XML文件聲明中的version屬性值setDocumentURI(StringdocumentURI)設(shè)置DocumenURIsetXmlVersion(StringmxlVersion)設(shè)置XML的版本createElement(Stringname)創(chuàng)建一個(gè)Element節(jié)點(diǎn),節(jié)點(diǎn)名稱由name參數(shù)指定createAttribute(Stringname)創(chuàng)建一個(gè)Attr節(jié)點(diǎn),屬性名稱由name參數(shù)指定,然后利用setAttributeNode方法設(shè)置為某個(gè)節(jié)點(diǎn)的屬性createCDATASection(Stringdata)創(chuàng)建一個(gè)CDATASection節(jié)點(diǎn)createTextNode(Stringtext)創(chuàng)建一個(gè)具有指定內(nèi)容的文本節(jié)點(diǎn)返回8.4Element節(jié)點(diǎn)

Element節(jié)點(diǎn)是Document的子孫節(jié)點(diǎn),表示標(biāo)記節(jié)點(diǎn),代表的常量是ELEMENT_NODE。Element節(jié)點(diǎn)可以是Element的子節(jié)點(diǎn)。Element節(jié)點(diǎn)可以使用如下表所示的方法來(lái)獲得相關(guān)的數(shù)據(jù)。

方法功能描述getTagName()返回該節(jié)點(diǎn)的名稱,即對(duì)應(yīng)XML文件的標(biāo)記名稱getAttribute(Stringname)返回該節(jié)點(diǎn)的對(duì)應(yīng)屬性的值,屬性名稱由參數(shù)name指定。即對(duì)應(yīng)XML文件標(biāo)記的屬性值getElementByTagName(Stringname)返回一個(gè)NodeList對(duì)象,該對(duì)象由該節(jié)點(diǎn)的Element類型的子孫節(jié)點(diǎn)組成,子孫節(jié)點(diǎn)的名稱由參數(shù)name指定getElementByTagNameNs(StringnamespaceURI,StringlocalName)返回一個(gè)NodeList對(duì)象,該對(duì)象由該節(jié)點(diǎn)的Element類型的子孫節(jié)點(diǎn)組成,子孫節(jié)點(diǎn)的名稱由參數(shù)localName指定,名稱空間由參數(shù)namespaceURI指定getAttributeNode(Stringname)返回屬性節(jié)點(diǎn)hasAttribute(Stringname)判斷該節(jié)點(diǎn)是否具有某個(gè)屬性,屬性名稱由參數(shù)name指定hasAttributeNS(StringnamespaceURI,StringlocalName)判斷該節(jié)點(diǎn)是否具有某個(gè)屬性,屬性名稱由參數(shù)name指定,名稱空間由參數(shù)namespaceURI指定removeAttribute(Stringname)刪除name屬性removeAttributeNode(AttroldAttr)刪除當(dāng)前節(jié)點(diǎn)的oldAttr屬性setAttribute(Stringname,Stringvalue)設(shè)置name屬性的值setAttributeNode(AttrnewAttr)為當(dāng)前的節(jié)點(diǎn)設(shè)置屬性返回8.5Text節(jié)點(diǎn)(1)Text節(jié)點(diǎn)用來(lái)表示XML文件的文本內(nèi)容,Text節(jié)點(diǎn)代表的常量是TEXT_NODE。Text節(jié)點(diǎn)可以是Element節(jié)點(diǎn)的子節(jié)點(diǎn)。

Text節(jié)點(diǎn)不僅包括標(biāo)記的文本內(nèi)容,還包括標(biāo)記之間的空白。例如:<root><element1>text1</element1><element2>text2</element2></root>

root節(jié)點(diǎn)共有7個(gè)子孫節(jié)點(diǎn),其中包括2個(gè)Element類型子節(jié)點(diǎn):<element1>和<element2>。3個(gè)Text類型子節(jié)點(diǎn):<root>與<element1>之間的空白、</element1>與<element2>之間的空白和</element2>與</root>之間的空白。2個(gè)Text類型的孫節(jié)點(diǎn):<element1>與</element1>之間的文本“text1”和<element2>與</element2>之間的文本“text2”。

8.5Text節(jié)點(diǎn)(2)獲取Text類型的節(jié)點(diǎn)中的文本可以使用下面的方法:

StringgetWholeText()獲取的數(shù)據(jù)包括所有的內(nèi)容,包括其中的空白。對(duì)于Text類型的節(jié)點(diǎn)使用方法StringgetNodeName()返回的結(jié)果是:

#text

返回8.6CDATASection節(jié)點(diǎn)(1)

CDATASection節(jié)點(diǎn)對(duì)應(yīng)XML文件的CDATA段,表示CDATASection節(jié)點(diǎn)的常量是CDATA_SECTION_NODE,CDATASection節(jié)點(diǎn)可以是Element節(jié)點(diǎn)的子節(jié)點(diǎn)。

如果一個(gè)XML文件中含有CDATA段,在解析時(shí),節(jié)點(diǎn)的計(jì)算辦法有所特別,例如,XML文件的代碼如下:

<?mxlversion="1.0"?><root>text1<![CDATA[cdata1]]>text2<![CDATA[cdata2]]>text3</root>

獲取CDATASection類型的節(jié)點(diǎn)中的文本使用方法:

StringgetWholeText()

8.6CDATASection節(jié)點(diǎn)(2)

前面的XML文件節(jié)點(diǎn)的計(jì)算辦法是按照各節(jié)點(diǎn)在XML文件中出現(xiàn)的順序先后排列:text1<![CDATA[cdata1]]>text2<![CDATA[cdata2]]>text3Text類型節(jié)點(diǎn),節(jié)點(diǎn)的內(nèi)容包括:text1、cdata1、text2、cdata2、text3。

CDATASection類型節(jié)點(diǎn),節(jié)點(diǎn)的內(nèi)容包括:cdata1、text2、cdata2、text3。

Text類型節(jié)點(diǎn),節(jié)點(diǎn)的內(nèi)容包括:text2、cdata2、text3。

CDATASection類型節(jié)點(diǎn),節(jié)點(diǎn)的內(nèi)容包括:cdata2、text3。

Text類型節(jié)點(diǎn),節(jié)點(diǎn)的內(nèi)容包括:text3。

返回8.7Attr節(jié)點(diǎn)(1)

Attr節(jié)點(diǎn)表示屬性節(jié)點(diǎn),對(duì)應(yīng)XML文件中標(biāo)記的屬性,對(duì)應(yīng)的常量是ATTRIBUTE_NODE。在XML文件中,屬性是作為表示的附加信息,用于補(bǔ)充描述標(biāo)記,不是標(biāo)記的子標(biāo)記。在DOM中,Attr對(duì)象是包含在Element對(duì)象中的,所以,Attr節(jié)點(diǎn)不是Element節(jié)點(diǎn)的子節(jié)點(diǎn)。

Attr對(duì)象常用的方法見下表:方法功能描述getName()返回屬性的名稱getValue()返回屬性值setValue()設(shè)置屬性值getOwnerElement()返回屬性所屬的Element對(duì)象8.7Attr節(jié)點(diǎn)(2)要獲得Element節(jié)點(diǎn)的Attr節(jié)點(diǎn)需要Element節(jié)點(diǎn)調(diào)用getAttribute()方法,該方法返回一個(gè)NamedNodeMap對(duì)象,NamedNodeMap對(duì)象由節(jié)點(diǎn)組成,這些節(jié)點(diǎn)可以轉(zhuǎn)換為Attr節(jié)點(diǎn)。

//獲取節(jié)點(diǎn)的屬性列表

NamedNodeMapattrMap=node.getAttributes();//循環(huán)取出每一個(gè)屬性for(intj=0;j<attrMap.getLength();j++){//轉(zhuǎn)換為屬性節(jié)點(diǎn)

AttraNode=(Attr)attrMap.item(j);//輸出屬性名稱和屬性值System.out.print(aNode.getName()+“="+aNode.getValue()+";");}

返回8.8DocumentType節(jié)點(diǎn)8.8.1獲取DTD的基本信息8.8.2獲取實(shí)體

DocumentType類型節(jié)點(diǎn)是Document節(jié)點(diǎn)的一個(gè)子節(jié)點(diǎn)。

DocumentType類型節(jié)點(diǎn)對(duì)應(yīng)XML文件所關(guān)聯(lián)的DTD文件,通過(guò)DocumentType節(jié)點(diǎn)的子孫關(guān)系可以分析并獲得DTD文件中的數(shù)據(jù)。通過(guò)Document節(jié)點(diǎn)調(diào)用getDoctype()方法可以獲得該節(jié)點(diǎn)的DocumentType類型的子節(jié)點(diǎn)。DocumentType類型節(jié)點(diǎn)用常量DOCUMENT_TYPE_NODE表示。

返回獲取DTD的基本信息如果是關(guān)聯(lián)內(nèi)部的DTD,則DocumentType類型的節(jié)點(diǎn)可以調(diào)用getInternalSubset()方法返回內(nèi)部DTD的內(nèi)容。

如果一個(gè)文件關(guān)聯(lián)一個(gè)外部的DTD

,則返回DOCTYPE聲明中的相關(guān)信息,假設(shè)有如下的DOCTYPE聲明:

<!DOCTYPErootPUBLIC“-//ISO1234567//sunsang//ForXml//Ch”“01.dtd”>

調(diào)用方法:getName()

getPublicld()

getSystemId()

返回返回返回根標(biāo)記的名字“root”

正式公用標(biāo)識(shí)符“-//ISO1234567//sunsang//ForXml//Ch”

外部DTD的名字“01.xml”

返回獲取實(shí)體解析器在解析XML文件時(shí),會(huì)將DTD中的實(shí)體封裝為Eneity節(jié)點(diǎn),Eneity節(jié)點(diǎn)用ENTITY_NODE常量表示。DocumentType類型節(jié)點(diǎn)調(diào)用方法getEntities()方法可以獲得全部的實(shí)體。該方法返回NamedNodeMap類型的對(duì)象,該對(duì)象由節(jié)點(diǎn)組成,這些節(jié)點(diǎn)可以轉(zhuǎn)換為Entity類型的節(jié)點(diǎn)。

有兩個(gè)方法可以獲得實(shí)體的相關(guān)信息:getTextContent()

返回實(shí)體的內(nèi)容。

getInputEncoding()如果是外部實(shí)體,返回的是解析實(shí)體所使用的編碼。如果是內(nèi)部實(shí)體,返回null。返回8.9處理空白(1)在編寫XML文件時(shí),為了使文件變得美觀和易于閱讀,通常習(xí)慣采用代碼縮進(jìn)的方式,縮進(jìn)代碼就需要在行的前面加上空白區(qū)域。例如:

<persions><persion><name>xiaowang</name><sex>male</sex><age>25</age></persion></persions>

523416這段代碼就包含了6處沒有實(shí)際意義的空白,解析器在解析的時(shí)候并不考慮這么多,解析器會(huì)把這些空白全部當(dāng)成文本數(shù)據(jù)。所以,輸出來(lái)的解析數(shù)據(jù)包含了空白。如圖:8.9處理空白(2)如果想要讓解析器忽略這些縮進(jìn)的空白區(qū)域,首先,XML文件必須是有效的XML文件,即在文檔類型定義文件中規(guī)定了標(biāo)記是只含有子標(biāo)記或只含有文本內(nèi)容。然后,在獲得DOM解析器之前,需要設(shè)置解析器忽略空白:

8.9處理空白(3)……//創(chuàng)建解析工廠DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();//設(shè)置忽略縮進(jìn)空白factory.setIgnoringElementContentWhitespace(true);//獲得解析器DocumentBuilderbuilder=factory.newDocumentBuilder();

……解析出來(lái)的數(shù)據(jù)如圖所示:

返回8.10驗(yàn)證規(guī)范性和有效性

DOM解析器默認(rèn)驗(yàn)證XML文件的規(guī)范性,要驗(yàn)證XML文件的有效性,需要在建立解析器之前,通過(guò)DocumentBuilderFactory對(duì)象來(lái)設(shè)置:DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();factory.setValidating(true);

然后再建立相應(yīng)的解析器,關(guān)于驗(yàn)證XML文件的有效性,在前面的章節(jié)中已經(jīng)做了介紹,有關(guān)實(shí)例參見第3章3.2節(jié)和第4章4.8節(jié)。

返回8.11使用DOM生成XML文件(1)

使用DOM生成XML文件的步驟如下:

需要得到一個(gè)Document對(duì)象節(jié)點(diǎn)。獲得Document節(jié)點(diǎn)有兩種方法:第一,通過(guò)DocumentBuilder對(duì)象調(diào)用parse()方法返回一個(gè)Document節(jié)點(diǎn);第二,通過(guò)DocumentBuilder對(duì)象調(diào)用newDocument()方法生成一個(gè)Document節(jié)點(diǎn)。應(yīng)用程序?qū)ocument節(jié)點(diǎn)進(jìn)行修改,在內(nèi)存中建立一個(gè)節(jié)點(diǎn)樹。使用Transformer對(duì)象將內(nèi)存中的節(jié)點(diǎn)樹轉(zhuǎn)變成一個(gè)XML文件。

8.11使用DOM生成XML文件(2)

使用Transformer對(duì)象將一個(gè)Document節(jié)點(diǎn)轉(zhuǎn)變成一個(gè)XML文件需要經(jīng)過(guò)如下步驟:

需要建立一個(gè)TransformerFactory工廠對(duì)象實(shí)例:

TransformerFactorytFactory=TransformerFactory.newInstance();

tFactory對(duì)象調(diào)用newTransformer()方法得到一個(gè)Transformer對(duì)象實(shí)例:

Transformertransformer=tFactory.newTransformer();

將Document對(duì)象封裝在一個(gè)DOMSource對(duì)象中:

DOMSourcesource=newDOMSource(document);

建立一個(gè)StreamResult對(duì)象,用于封裝XML文件:

FileOutputStreamout=newFileOutputStream(newFile(“test.xml”));StreamResultresult=newStreamResult(out);

Transformer對(duì)象調(diào)用transforme()方法進(jìn)行轉(zhuǎn)換:

transformer.transform(source,result);

8.11使用DOM生成XML文件(3)

通過(guò)前面的步驟就可以獲得XML文件。下表列出了各個(gè)接口中常用的用于修改Documen節(jié)點(diǎn)的方法。

接口名稱方法名稱功能描述NodeappendChild(NodenewChild)向當(dāng)前節(jié)點(diǎn)添加一個(gè)新節(jié)點(diǎn),新節(jié)點(diǎn)由參數(shù)newChild指定removeChild(NodeoldChild)從當(dāng)前節(jié)點(diǎn)刪除由參數(shù)oldChild指定的節(jié)點(diǎn),replaceChild(NodenewChild,NodeoldChild)用參數(shù)newChild指定的節(jié)點(diǎn)替換由參數(shù)oldChild指定的節(jié)點(diǎn)Element(繼承Node接口的方法)removeAttributeNode(AttroldAttr)刪除Element節(jié)點(diǎn)的屬性setAttribute(Stringname,Stringvalue)為Element節(jié)點(diǎn)添加一個(gè)屬性,如果該屬性已經(jīng)存在,將用新屬性替換原來(lái)的屬性Text(繼承Node接口的方法)replaceWholeText(Stringcontent)用新的內(nèi)容替換當(dāng)前Text節(jié)點(diǎn)的內(nèi)容appendData(Stringarg)向當(dāng)前的Text節(jié)點(diǎn)追加文本內(nèi)容insertData(intoffset,Stringarg)向當(dāng)前的Text節(jié)點(diǎn)插入文本內(nèi)容,插入的位置由參數(shù)offset指定,表示第幾個(gè)字符之后deleteData(intoffset,intcount)刪除從第offset個(gè)字符后的count個(gè)字符replaceData(intoffset,intcount,Stringarg)用arg指定的內(nèi)容替換從第offset個(gè)字符后的count個(gè)字符返回8.12XML與JSP的結(jié)合(1)

JSP簡(jiǎn)介JSP(JavaServerPages)稱為Java服務(wù)器頁(yè)面,是由SUN公司倡導(dǎo)、許多公司參與一起建立的一種動(dòng)態(tài)網(wǎng)頁(yè)技術(shù)標(biāo)準(zhǔn)。J

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論