自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

利用DOM解析XML文檔實(shí)例

開(kāi)發(fā)
DOM是用與平臺(tái)和語(yǔ)言無(wú)關(guān)的方式表示XML文檔的官方W3C標(biāo)準(zhǔn),是以層次結(jié)構(gòu)組織的節(jié)點(diǎn)或信息片斷的集合,關(guān)于XML DOM,文章將結(jié)合實(shí)例,講解利用DOM解析XML的過(guò)程。

DOM是用與平臺(tái)和語(yǔ)言無(wú)關(guān)的方式表示XML文檔的官方W3C標(biāo)準(zhǔn)。DOM是以層次結(jié)構(gòu)組織的節(jié)點(diǎn)或信息片斷的集合。這個(gè)層次結(jié)構(gòu)允許開(kāi)發(fā)人員在樹(shù)中尋找特定信息。分析該結(jié)構(gòu)通常需要加載整個(gè)文檔和構(gòu)造層次結(jié)構(gòu),然后才能做任何工作。

由于它是基于信息層次的,因而DOM被認(rèn)為是基于樹(shù)或基于對(duì)象的。DOM 以及廣義的基于樹(shù)的處理具有幾個(gè)優(yōu)點(diǎn)。首先,由于樹(shù)在內(nèi)存中是持久的,因此可以修改它以便應(yīng)用程序能對(duì)數(shù)據(jù)和結(jié)構(gòu)作出更改。它還可以在任何時(shí)候在樹(shù)中上下導(dǎo)航,而不是像SAX那樣是一次性的處理。DOM使用起來(lái)也要簡(jiǎn)單得多。

另一方面,對(duì)于特別大的文檔,解析和加載整個(gè)文檔可能很慢且很耗資源,因此使用其他手段來(lái)處理這樣的數(shù)據(jù)會(huì)更好。這些基于事件的模型,比如SAX。 接著是 SAX這種處理的優(yōu)點(diǎn)非常類(lèi)似于流媒體的優(yōu)點(diǎn)。分析能夠立即開(kāi)始,而不是等待所有的數(shù)據(jù)被處理。而且,由于應(yīng)用程序只是在讀取數(shù)據(jù)時(shí)檢查數(shù)據(jù),因此不需要將數(shù)據(jù)存儲(chǔ)在內(nèi)存中。這對(duì)于大型文檔來(lái)說(shuō)是個(gè)巨大的優(yōu)點(diǎn)。

事實(shí)上,應(yīng)用程序甚至不必解析整個(gè)文檔;它可以在某個(gè)條件得到滿(mǎn)足時(shí)停止解析。一般來(lái)說(shuō),SAX還比它的替代者DOM快許多,再接著是JDOM,JDOM 的目的是成為 Java 特定文檔模型,它簡(jiǎn)化與 XML 的交互并且比使用 DOM 實(shí)現(xiàn)更快。由于是第一個(gè) Java 特定模型,JDOM 一直得到大力推廣和促進(jìn)。正在考慮通過(guò)“Java 規(guī)范請(qǐng)求 JSR-102”將它最終用作“Java 標(biāo)準(zhǔn)擴(kuò)展”。從 2000 年初就已經(jīng)開(kāi)始了 JDOM 開(kāi)發(fā)。

JDOM 與 DOM 主要有兩方面不同。首先,JDOM 僅使用具體類(lèi)而不使用接口。這在某些方面簡(jiǎn)化了 API,但是也限制了靈活性。第二,API 大量使用了 Collections 類(lèi),簡(jiǎn)化了那些已經(jīng)熟悉這些類(lèi)的 Java 開(kāi)發(fā)者的使用。

JDOM 文檔聲明其目的是“使用 20%(或更少)的精力解決 80%(或更多)Java/XML 問(wèn)題”(根據(jù)學(xué)習(xí)曲線(xiàn)假定為 20%)。JDOM 對(duì)于大多數(shù) Java/XML 應(yīng)用程序來(lái)說(shuō)當(dāng)然是有用的,并且大多數(shù)開(kāi)發(fā)者發(fā)現(xiàn) API 比 DOM 容易理解得多。JDOM 還包括對(duì)程序行為的相當(dāng)廣泛檢查以防止用戶(hù)做任何在 XML 中無(wú)意義的事。然而,它仍需要您充分理解 XML 以便做一些超出基本的工作(或者甚至理解某些情況下的錯(cuò)誤)。這也許是比學(xué)習(xí) DOM 或 JDOM 接口都更有意義的工作。

JDOM 自身不包含解析器。它通常使用 SAX2 解析器來(lái)解析和驗(yàn)證輸入 XML 文檔(盡管它還可以將以前構(gòu)造的 DOM 表示作為輸入)。它包含一些轉(zhuǎn)換器以將 JDOM 表示輸出成 SAX2 事件流、DOM 模型或 XML 文本文檔。JDOM 是在 Apache 許可證變體下發(fā)布的開(kāi)放源碼。

雖然 DOM4J 代表了完全獨(dú)立的開(kāi)發(fā)結(jié)果,但最初,它是 JDOM 的一種智能分支。它合并了許多超出基本 XML 文檔表示的功能,包括集成的 XPath 支持、XML Schema 支持以及用于大文檔或流化文檔的基于事件的處理。它還提供了構(gòu)建文檔表示的選項(xiàng),它通過(guò) DOM4J API 和標(biāo)準(zhǔn) DOM 接口具有并行訪(fǎng)問(wèn)功能。從 2000 下半年開(kāi)始,它就一直處于開(kāi)發(fā)之中。

為支持所有這些功能,DOM4J 使用接口和抽象基本類(lèi)方法。DOM4J 大量使用了 API 中的 Collections 類(lèi),但是在許多情況下,它還提供一些替代方法以允許更好的性能或更直接的編碼方法。直接好處是,雖然 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)用程序行為。

DOM4J 是一個(gè)非常非常優(yōu)秀的Java XML API,具有性能優(yōu)異、功能強(qiáng)大和極端易用使用的特點(diǎn),同時(shí)它也是一個(gè)開(kāi)放源代碼的軟件。如今你可以看到越來(lái)越多的 Java 軟件都在使用 DOM4J 來(lái)讀寫(xiě) XML,特別值得一提的是連 Sun 的 JAXM 也在用 DOM4J。 JDOM 和 DOM 在性能測(cè)試時(shí)表現(xiàn)不佳,在測(cè)試 10M 文檔時(shí)內(nèi)存溢出。在小文檔情況下還值得考慮使用 DOM 和 JDOM。雖然 JDOM 的開(kāi)發(fā)者已經(jīng)說(shuō)明他們期望在正式發(fā)行版前專(zhuān)注性能問(wèn)題,但是從性能觀點(diǎn)來(lái)看,它確實(shí)沒(méi)有值得推薦之處。另外,DOM 仍是一個(gè)非常好的選擇。DOM 實(shí)現(xiàn)廣泛應(yīng)用于多種編程語(yǔ)言。它還是許多其它與 XML 相關(guān)的標(biāo)準(zhǔn)的基礎(chǔ),因?yàn)樗将@得 W3C 推薦(與基于非標(biāo)準(zhǔn)的 Java 模型相對(duì)),所以在某些類(lèi)型的項(xiàng)目中可能也需要它(如在 JavaScript 中使用 DOM)。

SAX表現(xiàn)較好,這要依賴(lài)于它特定的解析方式。一個(gè) SAX 檢測(cè)即將到來(lái)的XML流,但并沒(méi)有載入到內(nèi)存(當(dāng)然當(dāng)XML流被讀入時(shí),會(huì)有部分文檔暫時(shí)隱藏在內(nèi)存中)。

無(wú)疑,DOM4J是這場(chǎng)測(cè)試的獲勝者,目前許多開(kāi)源項(xiàng)目中大量采用 DOM4J,例如大名鼎鼎的 Hibernate 也用 DOM4J 來(lái)讀取 XML 配置文件。如果不考慮可移植性,那就采用DOM4J吧!

使用基于事件的XML簡(jiǎn)單API(Simple API for XML)稱(chēng)為SAX和基于樹(shù)和節(jié)點(diǎn)的文檔對(duì)象模型(Document Object Module)稱(chēng)為DOM。Sun公司提供了Java API for XML Parsing(JAXP)接口來(lái)使用SAX和DOM,通過(guò)JAXP,我們可以使用任何與JAXP兼容的XML解析器。JAXP接口包含了三個(gè)包:

(1)org.w3c.dom W3C推薦的用于XML標(biāo)準(zhǔn)規(guī)劃文檔對(duì)象模型的接口。

(2)org.xml.sax 用于對(duì)XML進(jìn)行語(yǔ)法分析的事件驅(qū)動(dòng)的XML簡(jiǎn)單API(SAX)

(3)javax.xml.parsers解析器工廠工具,程序員獲得并配置特殊的特殊語(yǔ)法分析器。

前提

DOM編程不要其它的依賴(lài)包,因?yàn)镴DK里自帶的JDK里含有的上面提到的org.w3c.dom、org.xml.sax 和javax.xml.parsers包就可以滿(mǎn)意條件了。

#p#

使用DOM解析XML文檔

我們現(xiàn)在來(lái)看看DOM是如何解析XML的吧!同樣的,我將從一個(gè)簡(jiǎn)單的不能再簡(jiǎn)單的例子來(lái)說(shuō)明DOM是如何解析XML文檔的,先讓我們看看XML是什么內(nèi)容吧:

1.先建立一個(gè)configure.xml;存放在src包下的xml包下。

  1. <?xml version="1.0" encoding="gbk"?>   
  2. <books>   
  3. <book email="zhoujunhui">   
  4. <name>rjzjh</name>   
  5. <price>jjjjjj</price>   
  6. </book>   
  7. </books>  

2.建立解析程序,DomParse.java,存放在src下的ttg包下。

  1. package ttg;   
  2.  
  3. import java.io.FileInputStream;   
  4. import java.io.FileNotFoundException;   
  5. import java.io.IOException;   
  6. import java.io.InputStream;   
  7.  
  8. import javax.xml.parsers.DocumentBuilder;   
  9. import javax.xml.parsers.DocumentBuilderFactory;   
  10. import javax.xml.parsers.ParserConfigurationException;   
  11.  
  12. import org.w3c.dom.Document;   
  13. import org.w3c.dom.Element;   
  14. import org.w3c.dom.Node;   
  15. import org.w3c.dom.NodeList;   
  16. import org.xml.sax.SAXException;   
  17.  
  18. public class DomParse {   
  19. public DomParse() {   
  20.  
  21. //得到DOM解析器的工廠實(shí)例   
  22. //javax.xml.parsers.DocumentBuilderFactory類(lèi)的實(shí)例就是我們要的解析器工廠   
  23.  
  24. DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();   
  25. try {   
  26.  
  27. //通過(guò)javax.xml.parsers.DocumentBuilderFactory實(shí)例的靜態(tài)方法newDocumentBuilder()得到DOM解析器   
  28. DocumentBuilder dombuilder = domfac.newDocumentBuilder();   
  29.  
  30. //把要解析的XML文檔轉(zhuǎn)化為輸入流,以便DOM解析器解析它   
  31. InputStream is = new FileInputStream("src/xml/configure.xml");   
  32.  
  33. //解析XML文檔的輸入流,得到一個(gè)Document   
  34. //由XML文檔的輸入流得到一個(gè)org.w3c.dom.Document對(duì)象,以后的處理都是對(duì)Document對(duì)象進(jìn)行的   
  35. Document doc = dombuilder.parse(is);   
  36.  
  37. //得到XML文檔的根節(jié)點(diǎn)   
  38. //在DOM中只有根節(jié)點(diǎn)是一個(gè)org.w3c.dom.Element對(duì)象。   
  39. Element root = doc.getDocumentElement();   
  40.  
  41. //得到節(jié)點(diǎn)的子節(jié)點(diǎn)   
  42. //這是用一個(gè)org.w3c.dom.NodeList接口來(lái)存放它所有子節(jié)點(diǎn)的,還有一種輪循子節(jié)點(diǎn)的方法   
  43. NodeList books = root.getChildNodes();   
  44. if (books != null) {   
  45. for (int i = 0; i < books.getLength(); i++) {   
  46. Node book = books.item(i);   
  47. if (book.getNodeType() == Node.ELEMENT_NODE) {   
  48.  
  49. //取得節(jié)點(diǎn)的屬性值   
  50. //注意,節(jié)點(diǎn)的屬性也是它的子節(jié)點(diǎn)。它的節(jié)點(diǎn)類(lèi)型也是Node.ELEMENT_NODE   
  51. String email = book.getAttributes().getNamedItem("email").getNodeValue();   
  52. System.out.println(email);   
  53.  
  54. //輪循子節(jié)點(diǎn)   
  55. for (Node node = book.getFirstChild(); node != null; nodenode = node.getNextSibling())   
  56. {   
  57. if (node.getNodeType() == Node.ELEMENT_NODE) {   
  58. if (node.getNodeName().equals("name")) {   
  59. String name = node.getNodeValue();   
  60. String name1 = node.getFirstChild()   
  61. .getNodeValue();   
  62. System.out.println(name);   
  63. System.out.println(name1);   
  64. }   
  65. if (node.getNodeName().equals("price")) {   
  66. String price = node.getFirstChild()   
  67. .getNodeValue();   
  68. System.out.println(price);   
  69. }   
  70. }   
  71. }   
  72. }   
  73. }   
  74. }   
  75. } catch (ParserConfigurationException e) {   
  76. e.printStackTrace();   
  77. } catch (FileNotFoundException e) {   
  78. e.printStackTrace();   
  79. } catch (SAXException e) {   
  80. e.printStackTrace();   
  81. } catch (IOException e) {   
  82. e.printStackTrace();   
  83. }   
  84. }   
  85.  
  86. public static void main(String[] args) {   
  87. DomParse domp=new DomParse();   
  88. }   
  89. }  

【編輯推薦】

  1. XML DOM新手入門(mén)指南
  2. 構(gòu)建輕量級(jí)XML DOM分析程序
  3. 在JavaScript中如何實(shí)現(xiàn)DOM操作 
責(zé)任編輯:王曉東 來(lái)源: 百度空間
相關(guān)推薦

2010-09-28 10:03:15

DOM文檔對(duì)象模型

2010-09-28 11:03:19

XML DOM

2010-09-10 14:12:07

JavaScript

2012-05-30 10:03:57

dom4jXML亂碼

2010-09-15 14:40:07

HTMLposition屬性

2009-09-09 14:40:15

C# XML解析

2009-08-12 15:26:38

C#讀取XML文檔

2009-09-09 13:57:28

C# XML解析

2010-09-15 17:18:28

HTML DOM di

2009-11-02 11:02:58

VB.NET XML文

2010-09-28 11:11:23

XML DOMHTML DOM

2009-06-23 14:22:00

DOM文檔XML文件Java

2009-09-01 13:51:51

C#創(chuàng)建Word文檔

2009-12-02 13:07:27

PHP XMLRead

2011-12-28 10:57:37

2010-09-13 14:24:17

JavaScript

2010-09-28 10:24:50

HTML DOMXML DOM

2010-09-09 17:19:07

HTML DOMXML DOM

2010-09-13 17:12:55

JavaScript

2010-09-09 13:40:19

XML DOM
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)