日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

DOM解析器

發(fā)布時(shí)間:2023/12/2 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DOM解析器 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.DOM標(biāo)準(zhǔn)

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?
  • DocumentBuilderFactory factory= DocumentBuilderFactory. newInstance();
  • DocumentBuilderFactory factory= DocumentBuilderFactory. newInstance();
    然后factory對(duì)象調(diào)用newDocumentBuilder()方法返回一個(gè)DocumentBuilder對(duì)象(稱做DOM解析器),DocumentBuilder 類在javax.xml.parsers包中。例如:
    [java] view plaincopyprint?
  • DocumentBuilder builder=factory. newDocumentBuilder();
  • DocumentBuilder builder=factory. newDocumentBuilder();
    最后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?
  • Document document= builder. parse(new File("/mnt/sdcard/river.xml")) ;
  • Document document= builder. parse(new File("/mnt/sdcard/river.xml")) ;

    現(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?
  • File f= new File("/mnt/sdcard/river.xml");
  • Document document= builder. parse(f) ;
  • File f= new File("/mnt/sdcard/river.xml"); Document document= builder. parse(f) ;

    直接這樣指定assets下路徑是不幸的。File file = new File(" file:///android_asset/river.xml");原因是assets下的資源為原生的,只能用流的方式讀取,而且不能向assets目錄下寫。




    方法parse(InputStream in)可以解析輸入流參數(shù)in指向的XML文件,例如:

    [java] view plaincopyprint?
  • AssetManager assetManager = act.getAssets();
  • InputStream inputStream = assetManager.open("price.xml"); ;
  • Document document= builder. parse(inputStream) ;
  • AssetManager assetManager = act.getAssets(); InputStream inputStream = assetManager.open("price.xml"); ; Document document= builder. parse(inputStream) ;


    方法parse(String uri)可以解析參數(shù)uri指定的一個(gè)有效的資源,如果uri是一個(gè)鏈接地址,該鏈接地址必須是可以訪問(wèn)的,例如:

    [java] view plaincopyprint?
  • String uri="http://192.168.2.1/price.xml";
  • Document document= builder. parse(uri) ;
  • String uri="http://192.168.2.1/price.xml"; Document document= builder. parse(uri) ;
    除了通過(guò)parse方法得到Document對(duì)象外,還可以直接創(chuàng)建Document對(duì)象:

    [java] view plaincopyprint?
  • builder.newDocument();//可以創(chuàng)建一個(gè)Document,然后修改它
  • builder.newDocument();//可以創(chuàng)建一個(gè)Document,然后修改它

    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?
  • TransformerFactory transFactory=TransformerFactory. newInstance()
  • TransformerFactory transFactory=TransformerFactory. newInstance()

    然后transFactory對(duì)象調(diào)用newTransformer()方法得到一個(gè)Transformer對(duì)象,Transformer類在javax.xml.transform包中。

    [java] view plaincopyprint?
  • Transformer transformer=transFactory. newTransformer();
  • Transformer transformer=transFactory. newTransformer();

    然后將被變換的Document對(duì)象封裝到一個(gè)DOMSource對(duì)象中,DOMSource類在javax.xml.transform.dom包中。

    [java] view plaincopyprint?
  • DOMSource domSource=new DOMSource(document);
  • DOMSource domSource=new DOMSource(document);
    再然后將變換得到XML文件對(duì)象封裝到一個(gè)StreamResult對(duì)象中,StreamResult類在javax.xml.transform.stream包中。
    [java] view plaincopyprint?
  • File file=new File("/mnt/sdcard/newXML.xml");//生成在SDCard下名為newXML的XML文件
  • FileOutputStream out=new FileOutputStream(file);
  • StreamResult xmlResult=new StreamResult(out);
  • File file=new File("/mnt/sdcard/newXML.xml");//生成在SDCard下名為newXML的XML文件 FileOutputStream out=new FileOutputStream(file); StreamResult xmlResult=new StreamResult(out);
    最后,Transformer 對(duì)象transformer 調(diào)用transform方法實(shí)施變換:
    [java] view plaincopyprint?
  • transformer.transform(domSource, xmlResult);
  • transformer.transform(domSource, xmlResult);

    注意:以上用到了寫文件創(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文件:

    [java] view plaincopyprint?
  • <?xml version="1.0" encoding="utf-8"?>
  • <rivers>
  • <river name="靈渠" length="605">
  • <introduction>
  • 靈渠在廣西壯族自治區(qū)興安縣境內(nèi),是世界上最古老的運(yùn)河之一,有著“世界古代水利建筑明珠”的美譽(yù)。靈渠古稱秦鑿渠、零渠、陡河、興安運(yùn)河,于公元前214年鑿成通航,距今已2217年,仍然發(fā)揮著功用。
  • </introduction>
  • <imageurl>
  • http://www.2cto.com/uploadfile/2012/0228/20120228094142711.jpg
  • </imageurl>
  • </river>
  • <river name="膠萊運(yùn)河" length="200">
  • <introduction>
  • 膠萊運(yùn)河南起黃海靈山海口,北抵渤海三山島,流經(jīng)現(xiàn)膠南、膠州、平度、高密、昌邑和萊州等,全長(zhǎng)200公里,流域面積達(dá)5400平方公里,南北貫穿山東半島,溝通黃渤兩海。膠萊運(yùn)河自平度姚家村東的分水嶺南北分流。南流由麻灣口入膠州灣,為南膠萊河,長(zhǎng)30公里。北流由海倉(cāng)口入萊州灣,為北膠萊河,長(zhǎng)100余公里。
  • </introduction>
  • <imageurl>
  • http://www.2cto.com/uploadfile/2012/0228/20120228094142711.jpg
  • </imageurl>
  • </river>
  • <river name="蘇北灌溉總渠" length="168">
  • <introduction>
  • 位于淮河下游江蘇省北部,西起洪澤湖邊的高良澗,流經(jīng)洪澤,青浦、淮安,阜寧、射陽(yáng),濱海等六縣(區(qū)),東至扁擔(dān)港口入海的大型人工河道。全長(zhǎng)168km。
  • </introduction>
  • <imageurl>
  • http://www.2cto.com/uploadfile/2012/0228/20120228094142711.jpg
  • </imageurl>
  • </river>
  • </rivers>
  • <?xml version="1.0" encoding="utf-8"?> <rivers><river name="靈渠" length="605"><introduction>靈渠在廣西壯族自治區(qū)興安縣境內(nèi),是世界上最古老的運(yùn)河之一,有著“世界古代水利建筑明珠”的美譽(yù)。靈渠古稱秦鑿渠、零渠、陡河、興安運(yùn)河,于公元前214年鑿成通航,距今已2217年,仍然發(fā)揮著功用。</introduction><imageurl>http://www.2cto.com/uploadfile/2012/0228/20120228094142711.jpg</imageurl></river><river name="膠萊運(yùn)河" length="200"><introduction>膠萊運(yùn)河南起黃海靈山海口,北抵渤海三山島,流經(jīng)現(xiàn)膠南、膠州、平度、高密、昌邑和萊州等,全長(zhǎng)200公里,流域面積達(dá)5400平方公里,南北貫穿山東半島,溝通黃渤兩海。膠萊運(yùn)河自平度姚家村東的分水嶺南北分流。南流由麻灣口入膠州灣,為南膠萊河,長(zhǎng)30公里。北流由海倉(cāng)口入萊州灣,為北膠萊河,長(zhǎng)100余公里。</introduction><imageurl>http://www.2cto.com/uploadfile/2012/0228/20120228094142711.jpg</imageurl></river><river name="蘇北灌溉總渠" length="168"><introduction>位于淮河下游江蘇省北部,西起洪澤湖邊的高良澗,流經(jīng)洪澤,青浦、淮安,阜寧、射陽(yáng),濱海等六縣(區(qū)),東至扁擔(dān)港口入海的大型人工河道。全長(zhǎng)168km。</introduction><imageurl>http://www.2cto.com/uploadfile/2012/0228/20120228094142711.jpg</imageurl></river></rivers>


    ?

    [java] view plaincopyprint?
  • private Document parseXML(InputStream is)
  • { if(is == null) return null;
  • DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  • // dbf.setValidating(true);//設(shè)置檢查XML文件的有效性
  • // dbf.setIgnoringElementContentWhitespace(true);//設(shè)置忽略空白
  • // dbf.setNamespaceAware(false);//設(shè)置為true時(shí),由DocumentBuilderFactory產(chǎn)生的DOM解析器支持名稱空間
  • DocumentBuilder db = null; //DOM解析器
  • Document doc = null;
  • try {
  • db = dbf.newDocumentBuilder();
  • } catch (ParserConfigurationException e) {
  • // TODO Auto-generated catch block
  • e.printStackTrace();
  • }
  • try {
  • doc = db.parse(is);//可以通過(guò)解析XML得到一個(gè)Document
  • // db.newDocument();//可以創(chuàng)建一個(gè)Document,然后修改它
  • } catch (SAXException e) {
  • // TODO Auto-generated catch block
  • e.printStackTrace();
  • } catch (IOException e) {
  • // TODO Auto-generated catch block
  • e.printStackTrace();
  • }
  • DocumentType docType = doc.getDoctype();
  • String xmlEncoding = doc.getXmlEncoding();//android2.1不支持
  • String xmlVersion = doc.getXmlVersion();
  • boolean isAlone = doc.getXmlStandalone();//android2.1不支持
  • NodeList list = doc.getElementsByTagName("river");
  • int length = list.getLength();
  • for(int k = 0;k<length;k++)
  • {
  • Node node = list.item(k);
  • String nodeName = node.getNodeName();
  • String textContent = node.getTextContent();
  • //取得當(dāng)前節(jié)點(diǎn)下的所有Text節(jié)點(diǎn)內(nèi)容,這里就包括introduction下和imageUrl下的Text以及空格
  • }
  • return doc;
  • private Document parseXML(InputStream is){ if(is == null) return null;DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // dbf.setValidating(true);//設(shè)置檢查XML文件的有效性 // dbf.setIgnoringElementContentWhitespace(true);//設(shè)置忽略空白 // dbf.setNamespaceAware(false);//設(shè)置為true時(shí),由DocumentBuilderFactory產(chǎn)生的DOM解析器支持名稱空間DocumentBuilder db = null; //DOM解析器Document doc = null;try {db = dbf.newDocumentBuilder();} catch (ParserConfigurationException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {doc = db.parse(is);//可以通過(guò)解析XML得到一個(gè)Document // db.newDocument();//可以創(chuàng)建一個(gè)Document,然后修改它} catch (SAXException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}DocumentType docType = doc.getDoctype();String xmlEncoding = doc.getXmlEncoding();//android2.1不支持String xmlVersion = doc.getXmlVersion();boolean isAlone = doc.getXmlStandalone();//android2.1不支持NodeList list = doc.getElementsByTagName("river");int length = list.getLength();for(int k = 0;k<length;k++){Node node = list.item(k);String nodeName = node.getNodeName();String textContent = node.getTextContent(); //取得當(dāng)前節(jié)點(diǎn)下的所有Text節(jié)點(diǎn)內(nèi)容,這里就包括introduction下和imageUrl下的Text以及空格}return doc;


    其中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)記:

    [java] view plaincopyprint?
  • <姓名>張小三
  • <性別>男</性別>
  • <年齡>23</年齡>
  • </姓名>
  • <姓名>張小三 <性別>男</性別> <年齡>23</年齡> </姓名>


    該標(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”。

    更多 0

    總結(jié)

    以上是生活随笔為你收集整理的DOM解析器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。