成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

淺析SAX,DOM,JAXP,JDOM與DOM4J之間的關(guān)系

妤鋒シ / 2333人閱讀

摘要:通過(guò)解析器獲取文檔對(duì)象后,開(kāi)發(fā)人員可以很方便的對(duì)其進(jìn)行操作,如獲取更元素,獲取一個(gè)子元素,增加子元素,移除子元素。它并沒(méi)有為解析提供任何新功能,但是它為在獲取與解析器提供了更加直接的途徑。自身不包含解析器,默認(rèn)使用隨包一起發(fā)行的。

文章最初發(fā)表于我的個(gè)人博客非典型性程序猿

眾所周知,SAX與DOM是JAVA中兩大核心XML解析API類庫(kù),而JAXP,JDOM與DOM4J都是基于這兩大核心API而衍生出來(lái)的。今日興起看了看相關(guān)資料,寫篇文章總結(jié)總結(jié)^.^。

SAX與DOM

首先需要說(shuō)明白的是SAX與DOM的關(guān)系。

SAXDOM都是底層API,在JDK中他們的包路徑分別為:org.xml.sax與org.w3c.dom。自JDK1.5開(kāi)始,JDK中自帶的實(shí)現(xiàn)為Apache的xerces(位于com.sun.org.apache.xerces.internal.parsers下)。

SAXSimple API for XML的簡(jiǎn)稱,它是在JAVA平臺(tái)上第一個(gè)被廣泛使用的XML API。也就說(shuō)它是為JAVA而出現(xiàn)的。目前已經(jīng)有多個(gè)語(yǔ)言版本,比如C++。
DOMDocuments Object Model的簡(jiǎn)稱,與SAX不同的是,DOM是W3C的標(biāo)準(zhǔn),它出現(xiàn)的目的是為了實(shí)現(xiàn)一套跨平臺(tái)與語(yǔ)言的標(biāo)準(zhǔn)。

以上是它們之間的第一個(gè)不同。第二個(gè),就是解析方式的不同。

SAX是基于事件解析,解析過(guò)程中根據(jù)目前的XML元素類型,調(diào)用用戶自己實(shí)現(xiàn)的回調(diào)方法(或著叫事件方法)來(lái)處理,如:startDocument();,startElement(); 。
SAX2.0中有4個(gè)核心接口:

org.xml.sax.ContentHander

org.xml.sax.ErrorHandler

org.xml.sax.DTDHandler

org.xml.sax.EntityResolver

實(shí)現(xiàn)這幾個(gè)Handler,然后調(diào)用解析器相應(yīng)的set方法注冊(cè)給解析器,就可以完成各種元素的解析與處理。 對(duì)應(yīng)的注冊(cè)進(jìn)解析器的方法分別是:

parser.setContentHandler(ContentHander handler)

parser.setErrorHandler(ErrorHandler handler)

parser.setDTDHandler(DTDHandler handler)
完整例子:

 DefaultHandler  handler=new XmlParserHandler();//DefaultHandler已經(jīng)實(shí)現(xiàn)了全部org.xml.sax.ContentHandler,  
                                                   //org.xml.sax.ErrortHandler,org.xml.sax.DTDHandler和org.xml.sax.EntityHandler接口  
 XMLReader xr=XMLReaderFactory.createXMLReader();//獲取解析器實(shí)例  
 xr.setContentHandler(handler);//設(shè)置處理類  
        xr.setErrorHandler(handler);  
        xr.setDTDHandler(handler);  
xr.setFeature("http://xml.org/sax/features/validation", true);//開(kāi)啟DTD驗(yàn)證  
xr.setFeature("http://apache.org/xml/features/validation/schema", true);//開(kāi)啟SCHMAE驗(yàn)證  
xr.parse(new InputSource("F:/Work/Workspace/XmlStudy/test.xml"));  

基于事件處理的好處是,不需要等到整個(gè)XML文件被加載完成后在開(kāi)始處理,而是加載到哪處理到哪。這樣便帶來(lái)了效率上的優(yōu)勢(shì)。但是其也有明顯的不足,第一個(gè)不足便是無(wú)法隨機(jī)訪問(wèn)元素。如果你只想獲取第二元素的信息,那么你必須等到第一個(gè)元素處理完成后,第二個(gè)元素開(kāi)始的時(shí)候。如果這時(shí),你又需要返回第一個(gè)元素,那么對(duì)不起,已經(jīng)來(lái)不及了。SAX不會(huì)主動(dòng)記憶或保存已處理過(guò)的元素(為了效率)。為了實(shí)現(xiàn)前面的需求,開(kāi)發(fā)人員需要自己使用容器來(lái)保存處理過(guò)的元素,并且建立一個(gè)模型來(lái)表示XML的樹形結(jié)構(gòu)。這樣一來(lái)也就帶來(lái)了第二個(gè)缺點(diǎn),使用的復(fù)雜性。

再來(lái)說(shuō)說(shuō)DOM。DOM采用了解析方式是一次性加載整個(gè)XML文檔,在內(nèi)存中形成一個(gè)樹形的數(shù)據(jù)結(jié)構(gòu),這個(gè)數(shù)據(jù)結(jié)構(gòu)我們稱為文檔對(duì)象模型。通過(guò)DOM解析器獲取Documen文檔t對(duì)象后,開(kāi)發(fā)人員可以很方便的對(duì)其進(jìn)行操作,如getDocumentElement();(獲取更元素),getFirstChild();獲取一個(gè)子元素appendChild();增加子元素,removeChild();移除子元素。因此,使用DOM可以很方便對(duì)XML中的數(shù)據(jù)進(jìn)行獲取與修改,而不需要像SAX一樣自己設(shè)計(jì)模型保存獲取的數(shù)據(jù)。
完整例子:

  DOMParser dp=new DOMParser();  
  dp.parse(new InputSource("e:/test.xml"));  
  Document doc=dp.getDocument();  
  Element rootElemet=doc.getDocumentElement();  
  NodeList list=rootElemet.getChildNodes();  

跟重要的一點(diǎn)是,在DOM中所有Element都是Node,這意味著,我們不需要明確知道文檔的結(jié)構(gòu)就可以操作它。我們可以判斷當(dāng)前獲取到的任意Node對(duì)象類型來(lái)做不同操作。主要Node類型有:

- Node.DOCUMENT_NODE
- Node.ELEMENT_NODE
- Node.TEXT_NODE
- Node.CDATA_SECTION_NODE
- Node.PROCESSING_INSTRUCTION_NODE
- Node.ENTITY_REFERENCE_NODE
- Node.DOCUMENT_TYPE_NODE

但是,由于DOM是一次性加載整個(gè)XML文件到內(nèi)存, 如果XML文件非常龐大,構(gòu)建文檔樹的內(nèi)存與時(shí)間開(kāi)銷會(huì)很大,且很有可能導(dǎo)致內(nèi)存溢出異常。

那么如何在SAX與DOM直接選擇呢?這取決于下面幾個(gè)因素:

應(yīng)用程序的目的:如果打算對(duì)數(shù)據(jù)作出更改并將它輸出為 XML,那么在大多數(shù)情況下,DOM 是適當(dāng)?shù)倪x擇。并不是說(shuō)使用 SAX 就不能更改數(shù)據(jù),但是該過(guò)程要復(fù)雜得多,因?yàn)槟仨殞?duì)數(shù)據(jù)的一份拷貝而不是對(duì)數(shù)據(jù)本身作出更改。

數(shù)據(jù)容量: 對(duì)于大型文件,SAX 是更好的選擇。

數(shù)據(jù)將如何使用:如果只有數(shù)據(jù)中的少量部分會(huì)被使用,那么使用 SAX 來(lái)將該部分?jǐn)?shù)據(jù)提取到應(yīng)用程序中可能更好。 另一方面,如果您知道自己以后會(huì)回頭引用已處理過(guò)的大量信息,那么 SAX 也許不是恰當(dāng)?shù)倪x擇。

對(duì)速度的需要: SAX 實(shí)現(xiàn)通常要比 DOM 實(shí)現(xiàn)更快。

SAXDOM 不是相互排斥的,記住這點(diǎn)很重要。您可以使用 DOM 來(lái)創(chuàng)建 SAX 事件流,也可以使用 SAX 來(lái)創(chuàng)建 DOM 樹。事實(shí)上,用于創(chuàng)建 DOM 樹的大多數(shù)解析器實(shí)際上都使用 SAX 來(lái)完成這個(gè)任務(wù),比如DOM4JJDOM!

JAXP,JDOM與DOM4J JAXP

JAXP,全稱Java API for XML Processing,打開(kāi)其為JDK的目錄:javax.xml.parsers, 你會(huì)發(fā)現(xiàn)它與SAX和DOM一樣只是一套API。實(shí)際上,JAXP出現(xiàn)時(shí)SUN公司為了彌補(bǔ)JAVA在XML標(biāo)準(zhǔn)制定上的空白而制定的一套JAVA XML標(biāo)準(zhǔn)API。它并沒(méi)有為JAVA解析XML提供任何新功能,但是它為在JAVA獲取SAX與DOM解析器提供了更加直接的途徑。它封裝了SAX與DOM兩種接口,并在SAX與DOM的基礎(chǔ)之上,作了一套比較簡(jiǎn)單的api以供開(kāi)發(fā)。
例如:JAXP獲取SAX解析器:

  SAXParserFactory factory=SAXParserFactory.newInstance();  
  SAXParser parser=factory.newSAXParser();  
  parser.parse("F:/Work/Workspace/xiongqi/XmlStudy/test.xml", handler);  

獲取DOM解析器:

  DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();  
  DocumentBuilder builder= factory.newDocumentBuilder();  
  Document document= builder.parse("F:/Work/Workspace/xiongqi/XmlStudy/test.xml");  

在 JAXP 的早期版本中,自帶解析器的實(shí)現(xiàn)為 Apachede 的Crimson,在 JAXP 的新版本中 (包括在 JDK 中) ,Sun 已經(jīng)重新包裝了 Apache Xerces 做為解析器的實(shí)現(xiàn)。

JDOM

由于DOM是為了實(shí)現(xiàn)一套跨平臺(tái)與語(yǔ)言的標(biāo)準(zhǔn),因此使用它對(duì)于JAVA開(kāi)發(fā)人員來(lái)說(shuō)并不是特別的得心應(yīng)手,這時(shí)JDOM就出現(xiàn)了。

JDOM 的目的是成為 Java 特定文檔模型,它簡(jiǎn)化與 XML 的交互并且比使用 DOM 實(shí)現(xiàn)更快。而且它是第一個(gè) Java 特定模型。與DOM相比較,首先,JDOM 僅使用具體類而不使用接口。這在某些方面簡(jiǎn)化了API,但是也限制了靈活性。第二,API 大量使用了 Collections 類,相對(duì)于dom中的Node,簡(jiǎn)化了那些已經(jīng)熟悉這些類的Java 開(kāi)發(fā)者的使用。JDOM 自身不包含解析器,默認(rèn)使用隨jar包一起發(fā)行的pache Xerces。

例子:

SAXBuilder builder = new SAXBuilder(false);  
Document doc = builder.build(in);  

從上面代碼中可以看出,JDOM使用SAX2 解析器來(lái)解析和驗(yàn)證輸入 XML 文檔,然后構(gòu)建Doucment對(duì)象。

DOM4J

DOM4J 最初是 JDOM 的一個(gè)分支。它合并了許多超出基本 XML 文檔表示的功能,包括集成的 XPath 支持、XML Schema 支持以及用于大文檔或流化文檔的基于事件的處理。它還提供了構(gòu)建文檔表示的選項(xiàng),它通過(guò) DOM4J API 和標(biāo)準(zhǔn) DOM 接口具有并行訪問(wèn)功能。

為支持所有這些功能,DOM4J 使用接口抽象基本類方法。DOM4J 大量使用了 API 中的Collections 類,但是在許多情況下,它還提供一些替代方法以允許更好的性能或更直接的編碼方法。直接好處是,雖然 DOM4J 付出了更復(fù)雜的 API 的代價(jià),但是它提供了比 JDOM 大得多的靈活性。在添加靈活性、XPath 集成和對(duì)大文檔處理的目標(biāo)時(shí),DOM4J 的目標(biāo)與 JDOM 是一樣的:針對(duì) Java開(kāi)發(fā)者的易用性和直觀操作。它還致力于成為比 JDOM 更完整的解決方案,實(shí)現(xiàn)在本質(zhì)上處理所有Java/XML 問(wèn)題的目標(biāo)。在完成該目標(biāo)時(shí),它比 JDOM 更少?gòu)?qiáng)調(diào)防止不正確的應(yīng)用程序行為。

例子:

SAXReader reader = new SAXReader(false);  
Document  doc = reader.read(in);  

DOM4J 是一個(gè)非常非常優(yōu)秀的Java XML API,具有性能優(yōu)異、功能強(qiáng)大和極端易用使用的特點(diǎn),同時(shí)它也是一個(gè)開(kāi)放源代碼的軟件。如今你可以看到越來(lái)越多的 Java 軟件都在使用 DOM4J 來(lái)讀寫 XML,特別值得一提的是連 Sun 的 JAXM 也在用 DOM4J。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65165.html

相關(guān)文章

  • 淺析SAX,DOM,JAXP,JDOMDOM4J之間關(guān)系

    摘要:通過(guò)解析器獲取文檔對(duì)象后,開(kāi)發(fā)人員可以很方便的對(duì)其進(jìn)行操作,如獲取更元素,獲取一個(gè)子元素,增加子元素,移除子元素。它并沒(méi)有為解析提供任何新功能,但是它為在獲取與解析器提供了更加直接的途徑。自身不包含解析器,默認(rèn)使用隨包一起發(fā)行的。 showImg(https://segmentfault.com/img/bVDhQE?w=888&h=220); 文章最初發(fā)表于我的個(gè)人博客非典型性程序猿...

    JasinYip 評(píng)論0 收藏0
  • XML解析詳解|樂(lè)字節(jié)

    摘要:解析獲取解析器獲取文檔獲取根節(jié)點(diǎn)獲取根節(jié)點(diǎn)下所有的子節(jié)點(diǎn),也可以根據(jù)標(biāo)簽名稱獲取指定的直接點(diǎn)獲取元素的名稱和里面的文本創(chuàng)建創(chuàng)建節(jié)點(diǎn)創(chuàng)建屬性設(shè)置文本設(shè)置關(guān)系關(guān)于解析先講到這里了,請(qǐng)繼續(xù)關(guān)注樂(lè)字節(jié),后續(xù)超級(jí)干貨奉上,快快樂(lè)樂(lè)學(xué)。 大家好,樂(lè)字節(jié)的小樂(lè)又來(lái)了,Java技術(shù)分享哪里少的了小樂(lè)!上次我們說(shuō)了可擴(kuò)展標(biāo)記語(yǔ)言XML之二:XML語(yǔ)言格式規(guī)范、文檔組成,本文將介紹重點(diǎn)——XML解析。sh...

    LinkedME2016 評(píng)論0 收藏0
  • XML就是這么簡(jiǎn)單

    什么是XML? XML:extensiable markup language 被稱作可擴(kuò)展標(biāo)記語(yǔ)言 XML簡(jiǎn)單的歷史介紹: gml->sgml->html->xml gml(通用標(biāo)記語(yǔ)言)–在不同的機(jī)器進(jìn)行通信的數(shù)據(jù)規(guī)范 sgml(標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言) html(超文本標(biāo)記語(yǔ)言) 為什么我們需要使用XML呢? ①我們沒(méi)有XML這種語(yǔ)言之前,我們使用的是String作為兩個(gè)程序之間的通訊!現(xiàn)在問(wèn)...

    pf_miles 評(píng)論0 收藏0
  • XML就是這么簡(jiǎn)單

    什么是XML? XML:extensiable markup language 被稱作可擴(kuò)展標(biāo)記語(yǔ)言 XML簡(jiǎn)單的歷史介紹: gml->sgml->html->xml gml(通用標(biāo)記語(yǔ)言)–在不同的機(jī)器進(jìn)行通信的數(shù)據(jù)規(guī)范 sgml(標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言) html(超文本標(biāo)記語(yǔ)言) 為什么我們需要使用XML呢? ①我們沒(méi)有XML這種語(yǔ)言之前,我們使用的是String作為兩個(gè)程序之間的通訊!現(xiàn)在問(wèn)...

    yacheng 評(píng)論0 收藏0
  • XML基礎(chǔ)知識(shí)歸納

    摘要:它提供了一套非常省力的,可通過(guò),以及類似于的操作方法來(lái)取出和操作數(shù)據(jù)。 XML:可擴(kuò)展標(biāo)記型語(yǔ)言 隨著json等一些技術(shù)的普及,似乎xml的路子越來(lái)越窄,雖然xml的一些功能被其他的一些技術(shù)代替,但是學(xué)習(xí)xml還是非常有必要,如果用xml存儲(chǔ)一些大量數(shù)據(jù),還是有一定優(yōu)勢(shì)的,就算你不管這些,但是現(xiàn)有的很多框架以及技術(shù)的配置文件都存在于xml中,最起碼你得對(duì)它的結(jié)構(gòu)以及一些基本用法有一定了...

    Warren 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<