第6章 基于DOM的解析器_第1頁
第6章 基于DOM的解析器_第2頁
第6章 基于DOM的解析器_第3頁
第6章 基于DOM的解析器_第4頁
第6章 基于DOM的解析器_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第六章基于DOM的解析器

XML解析器XML解析器是XML和應(yīng)用程序之間的一個軟件組織,為應(yīng)用程序從XML文件解析出所需要的數(shù)據(jù).

有兩種類型的解析器:

基于DOM的解析器基于事件的解析器(SAX)6.1DOM解析器定義:DOM(DocumentObjectModel,文檔對象模型)是W3C制定的一套規(guī)范標(biāo)準(zhǔn).即規(guī)定了解析文件的接口.語言綁定:在特定語言中使用DOM規(guī)范就需要定義DOM規(guī)范指定的接口,并給出實(shí)現(xiàn)這些接口的類的集合.(本書主要講述DOM規(guī)范的Java語言綁定)DOM規(guī)范的核心:DOM規(guī)范指定了語言綁定需要實(shí)現(xiàn)的接口,簡單的說,各種基于DOM規(guī)范的解析器必須按照DOM規(guī)范在內(nèi)存中建立數(shù)據(jù).DOM規(guī)范的核心是樹模型.接口(interface)是描述類的部分行為的一組操作,它也是一個類提供給另一個類的一組操作。接口只是一組操作,沒有屬性。我們介紹的是Sun公司的DOM解析器,支持DOMlevel3的解析器.(JAXP(JavaAPIforXMLParsing)實(shí)現(xiàn)了DOM規(guī)范的Java語言綁定)6.1DOM解析器6.1DOM解析器DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();6.1DOM解析器對象Document是由實(shí)現(xiàn)了Node接口的類的實(shí)例構(gòu)成的,這些實(shí)例稱作Document對象中的節(jié)點(diǎn)。Document對象中的節(jié)點(diǎn)形成樹狀結(jié)構(gòu),也就是說XML文件的標(biāo)記、標(biāo)記的文本內(nèi)容、實(shí)體等都會和對象Document中的某個節(jié)點(diǎn)相對應(yīng)。應(yīng)用程序主要分析內(nèi)存中的樹狀結(jié)構(gòu)數(shù)據(jù)Document,就可以獲得XML文件中的各種數(shù)據(jù)。DOM解析器經(jīng)常使用下述3個方法解析文件:publicDocumentparse(Filef)throwsSAXException,IOException例如:Filef=newFile(“price.xml”);Documentdocument=builder.parse(f);6.1DOM解析器2.publicDocumentparse(InputStreamin)throwsSAXException,IOException例如:FileInputStreamin=newFileInputStream(“price.xml”);Documentdocument=builder.parse(in);6.1DOM解析器6.1DOM解析器3.publicDocumentparse(Stringuri)throwsSAXException,IOException例如:Stringuri=“/price.xml”;Documentdocument=builder.parse(uri);1.Node接口

parse方法將整個被解析的XML文件封裝成一個節(jié)點(diǎn)返回(XML文件和內(nèi)存中的Document節(jié)點(diǎn)相對應(yīng)),故應(yīng)用程序可以從Document節(jié)點(diǎn)的子子孫節(jié)點(diǎn)中獲取整個XML文件中數(shù)據(jù)的細(xì)節(jié).Node接口有如下的子接口:Attr,SDATASection,CharacterData,Comment,DocumentFragment,DocumentType,Element,Entity,EntityReference,Notation,ProcessingInstruction,Text6.2節(jié)點(diǎn)的類型Node接口常用方法:shortgetNodeType():返回一個表示節(jié)點(diǎn)類型的常量.NodeListgetChildNodes():返回一個有當(dāng)前節(jié)點(diǎn)的所有子節(jié)點(diǎn)組成的NodeList對象.NodegetFirstChild():返回當(dāng)前節(jié)點(diǎn)的第一個子節(jié)點(diǎn).NodegetLastChild():返回當(dāng)前節(jié)點(diǎn)的最后一個子節(jié)點(diǎn).NodeListgetTextContent():返回當(dāng)前節(jié)點(diǎn)及所有子孫節(jié)點(diǎn)中的文本內(nèi)容.6.2節(jié)點(diǎn)的類型DocumentDocumentTypeElementElementCDATASectionText6.2節(jié)點(diǎn)的類型3.節(jié)點(diǎn)的子孫關(guān)系6.3Document節(jié)點(diǎn)Document節(jié)點(diǎn)經(jīng)常使用下列方法獲取和該節(jié)點(diǎn)的相關(guān)方法:(1)ElementgetDocumentElement()(2)DocumentTypegetDoctype()(3)NodeListgetElementByTagName(Stringname)(4)NodeListgetElementsByTagNameNS(StringnamespaceURI,StringlocalName)(5)StringgetXmlEncoding()(6)booleangetXmlStandalone()(8)StringgetXmlVersion()Cha6_1.xml(P138)<?xmlversion="1.0"encoding="UTF-8"?><雇員列表><雇員>sdfs<姓名>張三</姓名><年齡>25歲</年齡><工資>3190元/月</工資></雇員><雇員><姓名>李四</姓名><年齡>35歲</年齡><工資>4320元/月</工資></雇員><雇員><姓名>王五</姓名><年齡>45歲</年齡><工資>5610元/月</工資></雇員></雇員列表>JAXPOne.javaimportorg.w3c.dom.*;importjavax.xml.parsers.*;importjava.io.*;publicclassJAXPOne{publicstaticvoidmain(Stringargs[]){try{DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();DocumentBuilderbuilder=factory.newDocumentBuilder();Documentdocument=builder.parse(newFile("Cha6_1.xml"));Stringversion=document.getXmlVersion();System.out.println("XML聲明的版本號:"+version);Stringencoding=document.getXmlEncoding();System.out.println("XML聲明的的編碼:"+encoding);Elementroot=document.getDocumentElement();StringrootName=root.getNodeName();System.out.println("XML文件根節(jié)點(diǎn)的名字:"+rootName);

NodeListnodelist=document.getElementsByTagName("雇員");intsize=nodelist.getLength();

for(intk=0;k<size;k++){Nodenode=nodelist.item(k);Stringname=node.getNodeName();Stringcontent=node.getTextContent();System.out.print(name);System.out.println(":"+content);}}catch(Exceptione){System.out.println(e);}}}6.4Element節(jié)點(diǎn)Element節(jié)點(diǎn)經(jīng)常使用的方法獲取和該節(jié)點(diǎn)相關(guān)的信息(1)StringgetTagName()(2)StringgetAttribute(Stringname)(3)NodeListgetElementByTagName(Stringname)(4)NodeListgetElementByTagNameNS(StringnamespaceURI,StringlocalName)(5)booleanhasAttribute(Stringname)(6)booleanhasAttribute(StringnamspaceURI,StringlocalName)shortgetNodeType()用于返回節(jié)點(diǎn)的類型,如果返回值是Node.ELEMENT_NODE,那么該節(jié)點(diǎn)就是Element節(jié)點(diǎn).Cha6_2.xml(P140)<?xmlversion="1.0"encoding="UTF-8"?><圖書摘要><Java基礎(chǔ)教程ISBN="7302091420">Java是一門很優(yōu)秀的語言,具有平臺無關(guān)等特點(diǎn)。

</Java基礎(chǔ)教程><JSP基礎(chǔ)教程ISBN="7302096066">JSP是Sun公司推出的動態(tài)網(wǎng)頁技術(shù)標(biāo)準(zhǔn).</JSP基礎(chǔ)教程><XML基礎(chǔ)教程ISBN="7802096565">XML是萬維網(wǎng)聯(lián)盟定義的一種語言

</XML基礎(chǔ)教程></圖書摘要>JAXPTwo.javaimportorg.w3c.dom.*;importjavax.xml.parsers.*;importjava.io.*;publicclassJAXPTwo{publicstaticvoidmain(Stringargs[]){try{DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();DocumentBuilderbuilder=factory.newDocumentBuilder();Documentdocument=builder.parse(newFile("Cha6_2.xml"));Elementroot=document.getDocumentElement();StringrootName=root.getNodeName();System.out.println("XML文件根節(jié)點(diǎn)的名字:"+rootName);

NodeListnodeList=root.getChildNodes();intsize=nodeList.getLength();for(intk=0;k<size;k++){Nodenode=nodeList.item(k);if(node.getNodeType()==Node.ELEMENT_NODE){ElementelementNode=(Element)node;Stringname=elementNode.getNodeName();Stringid=elementNode.getAttribute("ISBN");Stringcontent=elementNode.getTextContent();System.out.print(name);System.out.print(id);System.out.println(":"+content);}}}catch(Exceptione){System.out.println(e);}}}6.5Text節(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)。例如:<姓名>張小三<性別>男</性別><年齡>23</年齡></姓名>StringgetWholeText():獲取節(jié)點(diǎn)中的文本(包括其中的空白字符)shortgetNodeType()用于返回節(jié)點(diǎn)的類型,如果返回值是Node.TEXT_NODE,那么該節(jié)點(diǎn)就是Text節(jié)點(diǎn).Cha6_3.xml<?xmlversion="1.0"encoding="UTF-8"?><商品信息><名稱>電視機(jī)

<生產(chǎn)日期>2005年</生產(chǎn)日期><庫存量>120臺</庫存量><單價>2390元</單價></名稱><名稱>洗衣機(jī)

<生產(chǎn)日期>2005年</生產(chǎn)日期><庫存量>234臺</庫存量><單價>1234元</單價></名稱></商品信息>JAXPThree.javaimportorg.w3c.dom.*;importjavax.xml.parsers.*;importjava.io.*;publicclassJAXPThree{publicstaticvoidmain(Stringargs[]){

OutContentoutContent=newOutContent();try{

DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();DocumentBuilderbuilder=factory.newDocumentBuilder();Documentdocument=builder.parse(newFile("Cha6_3.xml"));Elementroot=document.getDocumentElement();StringrootName=root.getNodeName();System.out.println("XML文件根節(jié)點(diǎn)的名字:"+rootName);

NodeListnodeList=root.getChildNodes();outContent.output(nodeList);

System.out.println("一共有"+outContent.m+"個Text節(jié)點(diǎn)");}catch(Exceptione){System.out.println(e);}}}classOutContent{intm=0;publicvoidoutput(NodeListnodeList){intsize=nodeList.getLength();for(intk=0;k<size;k++){Nodenode=nodeList.item(k);if(node.getNodeType()==Node.TEXT_NODE){TexttextNode=(Text)node;Stringcontent=textNode.getWholeText();m++;System.out.print(content);}if(node.getNodeType()==Node.ELEMENT_NODE){ElementelementNode=(Element)node;Stringname=elementNode.getNodeName();System.out.print(name);NodeListnodes=elementNode.getChildNodes();output(nodes);}}}}6.6CDATASection節(jié)點(diǎn)

用于封裝CDATA段,CDATASection節(jié)點(diǎn)可以是Element的節(jié)點(diǎn)的子節(jié)點(diǎn).StringgetWholeText():獲取節(jié)點(diǎn)中的文本,即CDATA段中的文本(包括其中的空白字符)shortgetNodeType()用于返回節(jié)點(diǎn)的類型,如果返回值是Node.CDATA_SECTION_NODE,那么該節(jié)點(diǎn)就是CDATASection節(jié)點(diǎn).計(jì)算節(jié)點(diǎn)數(shù)目的方法,例如:<hi>北京<![CDATA[booleanboo=true&&false<你好>]]>上海<![CDATA[<大家好>]]></hi>6.6CDATASection節(jié)點(diǎn)6.7Attr節(jié)點(diǎn)讓Element節(jié)點(diǎn)調(diào)用調(diào)用NamedNodeMapgetAttributes()方法返回的NameNodeMap對象由節(jié)點(diǎn)組成,這些節(jié)點(diǎn)可以被轉(zhuǎn)換為Atrr節(jié)點(diǎn).StringgetName():返回屬性的名字StringgetValue():返回屬性的值6.8DocumentType節(jié)點(diǎn)DocumentType節(jié)點(diǎn)對應(yīng)著XML文件所關(guān)聯(lián)DTD文件.通過進(jìn)一步獲取該節(jié)點(diǎn)子孫節(jié)點(diǎn)來分析DTD文件中的數(shù)據(jù).Document調(diào)用getDoctype()返回當(dāng)前節(jié)點(diǎn)的DocmentType子節(jié)點(diǎn)StringgetName()StringgetPublicld()StringgetSystemld()StringgetInternalSubset()例如:<!DOCTYPE房子PUBLIC“-//ISO88//beijing//ForXML/Ch”“b1.dtd”獲取實(shí)體解析器將實(shí)體封裝為Entity節(jié)點(diǎn),DocumentType節(jié)點(diǎn)調(diào)用NamedNodeMapgetEntities()這個方法返回了一個NamedNodeMap對象,NamedNodeMap對象被轉(zhuǎn)換為Entity的節(jié)點(diǎn)。獲取實(shí)體方法:getTextContent()方法回返實(shí)體getInputEncoding()方法可以返回解析實(shí)體所用編碼或null6.8DocumentType節(jié)點(diǎn)6.9處理空白

如果讓DOM解析器忽略縮進(jìn)空白,即這些縮進(jìn)空白不在Document中形成Text節(jié)點(diǎn),那么滿足:XML文件必須有效所關(guān)聯(lián)的DTD文件必須規(guī)定XML文件的標(biāo)記不能有混合內(nèi)容DocumentBuilderFactory對象設(shè)置setIgnoringElementContentWhitespace(true)6.10驗(yàn)證規(guī)范性和有效性如果想要檢查一個XML文件是否有效,必須讓DocumentBuilderFactory對象factory事先設(shè)置是否檢查XML文件的有效性,如:factory.setValidating(ture)6.11使用DOM生成XML文件1.Transformer對象解析器parse方法將整個被解析的XML文件封裝成一個Document節(jié)點(diǎn)返回,我們可以對Document節(jié)點(diǎn)進(jìn)行修改,然后使用Transformer對象將一個Document節(jié)點(diǎn)變成為一個XML文件.變換步驟:解析器通過調(diào)用newDocument()可得到一個Document節(jié)點(diǎn),應(yīng)用程序修改這樣的Document節(jié)點(diǎn),然后使用Transformer對象對一個

溫馨提示

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

評論

0/150

提交評論