DOM解析器
DOM(Document Object Model,文檔對(duì)象模型)是W3C制定的一套規(guī)范標(biāo)準(zhǔn),即規(guī)定了解析文件的接口。各種語(yǔ)言可以按照DOM規(guī)范去實(shí)現(xiàn)這些接口,給出解析文件的解析器。
各種基于DOM規(guī)范解析器必須按照DOM規(guī)范在內(nèi)存中建立數(shù)據(jù),DOM規(guī)范的核心是樹模型。對(duì)于解析XML文件的解析器,解析器通過(guò)讀入XML文件在內(nèi)存中建立一個(gè)樹,也就是說(shuō)XML文件的標(biāo)記、標(biāo)記的文本內(nèi)容、實(shí)體等都會(huì)和內(nèi)存中樹的某個(gè)節(jié)點(diǎn)相對(duì)應(yīng)。一個(gè)應(yīng)用程序可以方便地操作內(nèi)存中樹的節(jié)點(diǎn)來(lái)處理XML文檔,獲取自己所需要的數(shù)據(jù)。
2.DOM解析器
用 DOM 解析模型的優(yōu)點(diǎn)是編程容易,開發(fā)人員只需要調(diào)用建樹的指令,然后利用navigation APIs訪問(wèn)所需的樹節(jié)點(diǎn)來(lái)完成任務(wù)。可以很容易的添加和修改樹中的元素。然而由于使用 DOM 解析器的時(shí)候需要處理整個(gè) XML 文檔,所以對(duì)性能和內(nèi)存的要求比較高,尤其是遇到很大的 XML 文件的時(shí)候。由于它的遍歷能力,DOM 解析器常用于 XML 文檔需要頻繁的改變的服務(wù)中。W3C推薦使用DOM解析。
3.DOM和XML文件的互相轉(zhuǎn)化
DOM解析器是DocumentBuilder類的實(shí)例。
XML轉(zhuǎn)化為DOM對(duì)象
首先使用javax.xml.parsers包中的DocumentBuilderFactory類調(diào)用其類方法newInstance()實(shí)例化一個(gè)DocumentBuilderFactory對(duì)象:
[java] view plaincopyprint?然后factory對(duì)象調(diào)用newDocumentBuilder()方法返回一個(gè)DocumentBuilder對(duì)象(稱做DOM解析器),DocumentBuilder 類在javax.xml.parsers包中。例如:
[java] view plaincopyprint?
最后builder對(duì)象調(diào)用public Document parse(File f)方法解析參數(shù)f指定的文件,并將解析內(nèi)容以對(duì)象的形式返回,該對(duì)象是實(shí)現(xiàn)了Document接口的一個(gè)實(shí)例,Document 接口在org.w3c.dom包中。例如:
[java] view plaincopyprint?
現(xiàn)在,應(yīng)用程序只要分析內(nèi)存中的樹狀結(jié)構(gòu)數(shù)據(jù)Document,就可以獲得XML文件中的各種數(shù)據(jù)了。
DOM解析器經(jīng)常使用下述3個(gè)方法解析XML文件:
public Document parse(File f) throws SAXException, IOException
public Document parse(InputStream in) throws SAXException, IOException
public Document parse(String uri) throws SAXException, IOException
其中:
方法parse(File f)可以解析參數(shù)f指定的XML文件,例如:
[java] view plaincopyprint?直接這樣指定assets下路徑是不幸的。File file = new File(" file:///android_asset/river.xml");原因是assets下的資源為原生的,只能用流的方式讀取,而且不能向assets目錄下寫。
方法parse(InputStream in)可以解析輸入流參數(shù)in指向的XML文件,例如:
[java] view plaincopyprint?
方法parse(String uri)可以解析參數(shù)uri指定的一個(gè)有效的資源,如果uri是一個(gè)鏈接地址,該鏈接地址必須是可以訪問(wèn)的,例如:
[java] view plaincopyprint?除了通過(guò)parse方法得到Document對(duì)象外,還可以直接創(chuàng)建Document對(duì)象:
[java] view plaincopyprint?
DOM對(duì)象轉(zhuǎn)化為XML文件
解析器通過(guò)在內(nèi)存中建立和XML結(jié)構(gòu)相對(duì)應(yīng)的樹狀結(jié)構(gòu)數(shù)據(jù),使得應(yīng)用程序可以方便地獲得XML文件中的數(shù)據(jù),同時(shí)提供了使用內(nèi)存中的樹狀結(jié)構(gòu)數(shù)據(jù)建立一個(gè)XML文件的API,即使用解析器得到的Document對(duì)象建立一個(gè)新的XML文件。但是需要注意的是,Android2.1中沒(méi)有相應(yīng)的類包,從2.2開始才加入了。
解析器的parse方法將整個(gè)被解析的XML文件封裝成一個(gè)Document節(jié)點(diǎn)返回,我們可以對(duì)Document節(jié)點(diǎn)進(jìn)行修改,然后使用 Transformer對(duì)象將一個(gè)Document節(jié)點(diǎn)變換為一個(gè)XML文件。
步驟如下:
首先使用javax.xml.transform包中的TransformerFactory類建立一個(gè)對(duì)象,
[java] view plaincopyprint?然后transFactory對(duì)象調(diào)用newTransformer()方法得到一個(gè)Transformer對(duì)象,Transformer類在javax.xml.transform包中。
然后將被變換的Document對(duì)象封裝到一個(gè)DOMSource對(duì)象中,DOMSource類在javax.xml.transform.dom包中。
再然后將變換得到XML文件對(duì)象封裝到一個(gè)StreamResult對(duì)象中,StreamResult類在javax.xml.transform.stream包中。
[java] view plaincopyprint?
最后,Transformer 對(duì)象transformer 調(diào)用transform方法實(shí)施變換:
[java] view plaincopyprint?
注意:以上用到了寫文件創(chuàng)建文件等,所以需要在AndroidManifest.xml中加入訪問(wèn)SDCard的權(quán)限
<!--在SDCard中創(chuàng)建與刪除文件權(quán)限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!--往SDCard寫入數(shù)據(jù)權(quán)限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
1. 節(jié)點(diǎn)(Node)
解析器調(diào)用parse方法返回一個(gè)實(shí)現(xiàn)了Document接口的實(shí)例,該實(shí)例也稱做Document對(duì)象,應(yīng)用程序可以從Document節(jié)點(diǎn)的子孫節(jié)點(diǎn)中獲取整個(gè)XML文件中數(shù)據(jù)的細(xì)節(jié),它是由實(shí)現(xiàn)了Node接口的實(shí)例組成的樹狀結(jié)構(gòu)數(shù)據(jù),這些實(shí)例稱做Document對(duì)象中的節(jié)點(diǎn)。實(shí)際上Document接口也是Node接口的子接口,也就是說(shuō),parse方法將整個(gè)被解析的XML文件封裝成一個(gè)節(jié)點(diǎn)返回(XML文件和內(nèi)存中的Document節(jié)點(diǎn)相對(duì)應(yīng)),因此,我們也可以稱Document對(duì)象為Document節(jié)點(diǎn)。
Document對(duì)象中的節(jié)點(diǎn)形成樹狀結(jié)構(gòu),也就是說(shuō)XML文件的標(biāo)記、標(biāo)記的文本內(nèi)容、實(shí)體等都會(huì)和對(duì)象Document中的某個(gè)節(jié)點(diǎn)相對(duì)應(yīng)。應(yīng)用程序可以從Document節(jié)點(diǎn)的子孫節(jié)點(diǎn)中獲取整個(gè)XML文件中數(shù)據(jù)的細(xì)節(jié)。
按照DOM規(guī)范,Node接口有如下的子接口:
Attr, CDATASection, CharacterData, Comment, Document, DocumentFragment, DocumentType, Element, Entity, EntityReference, Notation, ProcessingInstruction, Text
任何實(shí)現(xiàn)上述某個(gè)接口的類的實(shí)例都稱做一個(gè)節(jié)點(diǎn)。
2.Node的常用方法
short getNodeType()
返回一個(gè)表示節(jié)點(diǎn)類型的常量(Node接口規(guī)定的常量值),例如,對(duì)于Element節(jié)點(diǎn),getNodeType()方法返回的值為:Node.ELEMENT_NODE
NodeList getChildNodes()
返回一個(gè)由當(dāng)前節(jié)點(diǎn)的所有子節(jié)點(diǎn)組成的NodeList對(duì)象。
Node getFirstChild()
返回當(dāng)前節(jié)點(diǎn)的第一個(gè)子節(jié)點(diǎn)。
Node getLastChild()
返回當(dāng)前節(jié)點(diǎn)的最后一個(gè)子節(jié)點(diǎn)。
NodeList getTextContent()
返回當(dāng)前節(jié)點(diǎn)及所有子孫節(jié)點(diǎn)中的文本內(nèi)容。
3.節(jié)點(diǎn)的子孫關(guān)系
為了解析規(guī)范的XML文件,DOM規(guī)范規(guī)定了各種類型節(jié)點(diǎn)之間可以形成的子孫關(guān)系,比如,Document節(jié)點(diǎn)有且僅有一個(gè)Element節(jié)點(diǎn),也可以有一個(gè)DocumentType節(jié)點(diǎn)(規(guī)范的XML文件有且僅有一個(gè)根標(biāo)記,也可以有一個(gè)與其關(guān)聯(lián)的DTD文件),Element節(jié)點(diǎn)可以有Element子節(jié)點(diǎn)和Text子節(jié)點(diǎn)(規(guī)范的XML文件中的標(biāo)記可以有子標(biāo)記和文本)。
?
Document節(jié)點(diǎn)
Document節(jié)點(diǎn)的兩個(gè)直接子節(jié)點(diǎn)的類型分別是DocumentType類型和Element類型,其中的DocumentType節(jié)點(diǎn)對(duì)應(yīng)著XML文件所關(guān)聯(lián)的DTD文件,通過(guò)進(jìn)一步獲取該節(jié)點(diǎn)子孫節(jié)點(diǎn)來(lái)分析DTDL文件中的數(shù)據(jù);而其中的Element類型節(jié)點(diǎn)對(duì)應(yīng)著XML文件的根節(jié)點(diǎn),通過(guò)進(jìn)一步獲取該Element類型節(jié)點(diǎn)子孫節(jié)點(diǎn)來(lái)分析XML文件中的數(shù)據(jù)。
Document 節(jié)點(diǎn)經(jīng)常使用下列方法獲取和該節(jié)點(diǎn)相關(guān)的信息。
Element getDocumentElement()
返回當(dāng)前節(jié)點(diǎn)的Element子節(jié)點(diǎn)。
DocumentType getDoctype()
返回當(dāng)前節(jié)點(diǎn)的DocumentType子節(jié)點(diǎn)。
NodeList getElementsByTagName(String name)
返回一個(gè)NodeList對(duì)象,該對(duì)象由當(dāng)前節(jié)點(diǎn)的Element類型子孫節(jié)點(diǎn)組成,這些子孫節(jié)點(diǎn)的名字由參數(shù)name指定。
NodeList getElementsByTagNameNS(String namespaceURI,String localName)
返回一個(gè)NodeList對(duì)象,該對(duì)象由當(dāng)前節(jié)點(diǎn)的Element類型子孫節(jié)點(diǎn)組成, 這些子孫節(jié)點(diǎn)的名字由參數(shù)localName指定,名稱空間由參數(shù)namespaceURI 指定。
String getXmlEncoding()
返回XML文件使用的編碼,即XML聲明中encoding屬性的值。
boolean getXmlStandalone()
返回XML聲明中的standalone屬性的值。未指定時(shí)返回NULL
standalone 用來(lái)表示該文件是否呼叫其它外部的文件。 這里所指的外部文件其實(shí)就是查檢XML是不是有效的約束文件,或是DTD或是Schema
String getXmlVersion()
返回XML聲明中的version屬性的值
其中g(shù)etXmlEncoding getXmlVersion getXmlStandalong在Android2.1中是沒(méi)有的。
要解析的XML文件:
?
其中g(shù)etXmlEncoding方法在XML設(shè)置了encoding的情況下,取不到,不知道為什么。
?
Element節(jié)點(diǎn)
Element節(jié)點(diǎn)是Document節(jié)點(diǎn)的最重要的子孫節(jié)點(diǎn),因?yàn)楸唤馕龅腦ML文件的標(biāo)記對(duì)應(yīng)著這樣類型的節(jié)點(diǎn)。表示Element節(jié)點(diǎn)的常量是Node.ELEMENT_NODE,一個(gè)節(jié)點(diǎn)用
short getNodeType()方法返回的值如果等于Node.ELEMENT_NODE,那么該節(jié)點(diǎn)就是Element節(jié)點(diǎn)。
Element節(jié)點(diǎn)經(jīng)常使用下列方法獲取和該節(jié)點(diǎn)相關(guān)的信息。
String getTagName()
返回該節(jié)點(diǎn)的名稱,該名稱就是此節(jié)點(diǎn)對(duì)應(yīng)的XML中的標(biāo)記名稱。
String getAttribute(String name)
返回該節(jié)點(diǎn)中參數(shù)name指定的屬性值,該屬性值是此節(jié)點(diǎn)對(duì)應(yīng)的XML標(biāo)記中的屬性值。
NodeList getElementsByTagName(String name)
返回一個(gè)NodeList對(duì)象,該對(duì)象由當(dāng)前節(jié)點(diǎn)的Element類型子孫節(jié)點(diǎn)組成,這些子孫節(jié)點(diǎn)的名字由參數(shù)name指定。
NodeList getElementsByTagNameNS(String namespaceURI,String localName)返回一個(gè)NodeList對(duì)象,該對(duì)象由當(dāng)前節(jié)點(diǎn)的Element類型子孫節(jié)點(diǎn)組成,這些子孫節(jié)點(diǎn)的 名字由參數(shù)localName指定,名稱空間由參數(shù)namespaceURI 指定。
boolean hasAttribute(String name)
判斷當(dāng)前節(jié)點(diǎn)是否有名字是參數(shù)name指定的屬性。
boolean hasAttributeNS(String namespaceURI, String localName)
判斷當(dāng)前節(jié)點(diǎn)是否有名字是參數(shù)name指定、名稱空間是namespaceURI指定的屬性。
String getTextContent() Android 2.1沒(méi)有本API
getTagName和getNodeName的區(qū)別
getTagName()方法是Element接口中的方法,getNodeName()方法是Element接口從Node接口繼承的方法。對(duì)于Element節(jié)點(diǎn),getTagName()和getNodeName()返回的都是Element節(jié)點(diǎn)對(duì)應(yīng)的XML文件中標(biāo)記的名稱。
?
Text節(jié)點(diǎn)
規(guī)范的XML文件的非空標(biāo)記可以有子標(biāo)記和文本內(nèi)容。在DOM規(guī)范中,解析器使用Element節(jié)點(diǎn)封裝標(biāo)記,用Text節(jié)點(diǎn)封裝標(biāo)記的文本內(nèi)容,即Element節(jié)點(diǎn)可以有Element子節(jié)點(diǎn)和Text節(jié)點(diǎn)。例如,對(duì)于下列標(biāo)記:
該標(biāo)記對(duì)應(yīng)的Element節(jié)點(diǎn)共有7個(gè)子孫節(jié)點(diǎn),其中2個(gè)Element子節(jié)點(diǎn)、3個(gè)Text子節(jié)點(diǎn)和2個(gè)Text孫節(jié)點(diǎn)。這些節(jié)點(diǎn)和XML中的標(biāo)記及文本有如下的對(duì)應(yīng)關(guān)系。
2個(gè)Element子節(jié)點(diǎn)分別對(duì)應(yīng)“姓名”標(biāo)記的2個(gè)子標(biāo)記:“性別”和“年齡”。3個(gè)Text子節(jié)點(diǎn)分別對(duì)應(yīng)著:“<姓名>”與“<性別>”之間的文本、“</性 別>”與“<年齡>”之間的空白類字符、“</年齡”與“</姓名>”之間的空白類字符。兩個(gè)Text孫節(jié)點(diǎn)分別對(duì)應(yīng)標(biāo)記“性別”和“年齡”的文本內(nèi)容。
表示Text節(jié)點(diǎn)的常量是Node.TEXT_NODE,一個(gè)節(jié)點(diǎn)調(diào)用short getNodeType()方法返回的值如果等于Node.TEXT_NODE,那么該節(jié)點(diǎn)就是Text節(jié)點(diǎn)。
Text節(jié)點(diǎn)使用String getWholeText()方法獲取節(jié)點(diǎn)中的文本(包括其中的空白字符)。Android2.1中沒(méi)有本API
注意:對(duì)于Text節(jié)點(diǎn),getNodeName()方法返回的是“#text”。
對(duì)于應(yīng)用程序而言,Text節(jié)點(diǎn)是較重要的節(jié)點(diǎn),因?yàn)門ext節(jié)點(diǎn)封裝著XML標(biāo)記中的文本數(shù)據(jù)。
Attr節(jié)點(diǎn)
在XML文件中,屬性并不是標(biāo)記的子標(biāo)記,因此,在DOM規(guī)范中,Att節(jié)點(diǎn)也不是Element節(jié)點(diǎn)的子節(jié)點(diǎn)。
如果想解析XML文件中標(biāo)記的屬性,必須讓對(duì)應(yīng)的Element節(jié)點(diǎn)調(diào)用NamedNodeMap getAttributes()方法。該方法返回的NamedNodeMap對(duì)象由節(jié)點(diǎn)組成,這些節(jié)點(diǎn)可以被轉(zhuǎn)換為Attr節(jié)點(diǎn)。Attr節(jié)點(diǎn)通過(guò)調(diào)用String getName()方法返回屬性的名字,調(diào)用String getValue()方法返回屬性的值。
處理空白
標(biāo)記之間的縮進(jìn)區(qū)域是為了使得XML文件看起來(lái)更美觀而形成的,但解析器并不知道這一點(diǎn),所以解析器仍然認(rèn)為它們是有用的文本數(shù)據(jù)(由空白類字符組成)
人們習(xí)慣上稱標(biāo)記之間的縮進(jìn)區(qū)是可忽略空白,這實(shí)際上不是很準(zhǔn)確,因?yàn)閄ML文件的標(biāo)記可以有文本和子標(biāo)記(混合內(nèi)容),在這種情況下,標(biāo)記之間的區(qū)域中就可能包含非空白的字符內(nèi)容。
如果我們不允許標(biāo)記有混合內(nèi)容,即標(biāo)記要么只有子標(biāo)記要么只有文本,在這種情形下,稱標(biāo)記之間的縮進(jìn)區(qū)域是可忽略空白就比較恰當(dāng),這些空白區(qū)確實(shí)使得XML文件看起來(lái)更加美觀,也是它們存在的惟一目的。
如果想讓DOM解析器忽略縮進(jìn)空白,即這些縮進(jìn)空白不在Document中形成Text節(jié)點(diǎn),那么XML文件必須是有效的,而且所關(guān)聯(lián)的DTD文件必須規(guī)定XML文件的標(biāo)記不能有混合內(nèi)容,同時(shí)DocumentBuilderFactory對(duì)象在給出DOM解析器之前,必須調(diào)用setIgnoringElementContentWhitespace(boolean whitespace)進(jìn)行設(shè)置,將參數(shù)whitespace的值設(shè)為true。
驗(yàn)證規(guī)范性和有效性
通過(guò)DocumentBuilderFactory對(duì)象factory事先設(shè)置是否檢查XML文件的有效性,如:factory.setValidating(true);
?
DocumentType節(jié)點(diǎn)
DocumentType節(jié)點(diǎn)是Document節(jié)點(diǎn)的一個(gè)子節(jié)點(diǎn)。我們已經(jīng)知道,解析器的parse方法將整個(gè)被解析的XML文件封裝成一個(gè)Document節(jié)點(diǎn)返回,Document節(jié)點(diǎn)的兩個(gè)子節(jié)點(diǎn)的類型分別是DocumentType類型和Element類型,其中的DocumentType節(jié)點(diǎn)對(duì)應(yīng)著XML文件所關(guān)聯(lián)的DTD文件,通過(guò)進(jìn)一步獲取該節(jié)點(diǎn)子孫節(jié)點(diǎn)來(lái)分析DTD文件中的數(shù)據(jù)。Document節(jié)點(diǎn)調(diào)用getDoctype() 返回當(dāng)前節(jié)點(diǎn)的DocumentType子節(jié)點(diǎn)。
獲取DTD的基本信息
假如XML文件中的DOCTYPE聲明為:<!DOCTYPE 房子 PUBLIC "-//ISO88//beijing//ForXML/Ch" "b1.dtd",那么
DocumentType節(jié)點(diǎn)調(diào)用getName()方法返回的是:房子
調(diào)用getPublicId()方法返回的是:-//ISO88//beijing//ForXML/Ch
調(diào)用getSystemId()方法返回的是:b1.dtd
一個(gè)XML文件可以關(guān)聯(lián)一個(gè)外部DTD或一個(gè)內(nèi)部DTD,也可二者皆有(見第3.9節(jié))。如果XML關(guān)聯(lián)一個(gè)內(nèi)部DTD,DocumentType節(jié)點(diǎn)調(diào)用getInternalSubset()方法可以返回內(nèi)部DTD的內(nèi)容。
獲取實(shí)體
DTD文件中可以定義實(shí)體,然后與該DTD文件關(guān)聯(lián)的XML文件可以通過(guò)實(shí)體引用使用該實(shí)體。實(shí)體又分為內(nèi)部實(shí)體和外部實(shí)體,所謂內(nèi)部實(shí)體就是實(shí)體的內(nèi)容已經(jīng)包含在DTD文件本身中;而外部實(shí)體是指實(shí)體的內(nèi)容是DTD文件以外的其他文件。
解析器將實(shí)體封裝為Entity節(jié)點(diǎn),DocumentType節(jié)點(diǎn)調(diào)用
NamedNodeMap getEntities()
方法可以得到全部的實(shí)體,該方法返回的NamedNodeMap對(duì)象由節(jié)點(diǎn)組成,這些節(jié)點(diǎn)可以被轉(zhuǎn)換為Entity節(jié)點(diǎn)。Entity節(jié)點(diǎn)通過(guò)調(diào)用getTextContent()方法返回實(shí)體,如果實(shí)體是一個(gè)外部文件,Entity節(jié)點(diǎn)通過(guò)調(diào)用getInputEncoding()方法可以返回解析該實(shí)體所使用的編碼;如果是內(nèi)部實(shí)體,getInputEncoding()方法返回null。
CDATASection節(jié)點(diǎn)
在XML文件中,標(biāo)記內(nèi)容中的文本數(shù)據(jù)不可以含有左尖括號(hào)、右尖括號(hào)、與符號(hào)、單引號(hào)和雙引號(hào)這些特殊字符,如果想使用這些字符,辦法之一是通過(guò)實(shí)體引用,如果需要許多這樣的字符,文本數(shù)據(jù)中就會(huì)出現(xiàn)很多實(shí)體引用或字符引用,導(dǎo)致文本數(shù)據(jù)的閱讀變得困難。使用CDATA(Character Data)段可以解決這一問(wèn)題,CDATA段用“<![CDATA[”作為段的開始,用“]]>”作為段的結(jié)束,段開始和段結(jié)束之間稱為CDATA段的內(nèi)容,解析器不對(duì)CDATA段的內(nèi)容做分析處理,因此,CDATA段中的內(nèi)容可以包含任意的字符。
在DOM規(guī)范中,解析器使用CDATASection節(jié)點(diǎn)封裝CDATA段,CDATASection節(jié)點(diǎn)可以是Element的節(jié)點(diǎn)的子節(jié)點(diǎn)。
節(jié)點(diǎn)數(shù)目的計(jì)算辦法如下。
首先將標(biāo)記中交替出現(xiàn)的普通文本和CDATA段按照它們?cè)跇?biāo)記中出現(xiàn)的先后順序排列,如:
普通文本1 CDATA段1 普通文本2 CDATA段2 普通文本3
那么該標(biāo)記對(duì)應(yīng)的Element節(jié)點(diǎn)的子節(jié)點(diǎn)順序如下。
1 / Text節(jié)點(diǎn):從“普通文本1”到“普通文本3”的區(qū)域,節(jié)點(diǎn)的文本內(nèi)容是普通文本和CDATA段中的內(nèi)容。
2 / CDATASection節(jié)點(diǎn):從“CDATA段1”到“普通文本3”的區(qū)域,節(jié)點(diǎn)的文本內(nèi)容是普通文本和CDATA段中的內(nèi)容。
3 / Text節(jié)點(diǎn):從“普通文本2”到“普通文本3”的區(qū)域,節(jié)點(diǎn)的文本內(nèi)容是普通文本和CDATA段中的內(nèi)容。
4 / CDATASection節(jié)點(diǎn):從“CDATA段2”到“普通文本3”的區(qū)域,節(jié)點(diǎn)的文本內(nèi)容是普通文本和CDATA段中的內(nèi)容。
5 / Text節(jié)點(diǎn):“普通文本3”,節(jié)點(diǎn)的文本內(nèi)容是普通文本。
表示CDATASection節(jié)點(diǎn)的常量是Node.CDATA_SECTION_NODE,一個(gè)節(jié)點(diǎn)調(diào)用short getNodeType()方法返回的值如果等于Node.CDATA_SECTION_NODE,那么該節(jié)點(diǎn)就是CDATASection節(jié)點(diǎn)。CDATASection節(jié)點(diǎn)使用String getWholeText()方法獲取節(jié)點(diǎn)中的文本,即CDATA段中的文本(包括其中的空白字符)。
注意:對(duì)于CDATASection節(jié)點(diǎn),getNodeName()方法返回的是“#cdata-section”。
總結(jié)
- 上一篇: Mathematica函数大全
- 下一篇: QueryRunner使用