解析xml的4種方法詳解

1. 介紹

1)DOM(JAXP?Crimson解析器)?
??????? DOM是用與平臺和語言無關的方式表示XML文檔的官方W3C標準。DOM是以層次結構組織的節點或信息片斷的集合。這個層次結構允許開發人員在樹中尋找特定信息。分析該結構通常需要加載整個文檔和構造層次結構,然后才能做任何工作。由于它是基于信息層次的,因而DOM被認為是基于樹或基于對象的。DOM以及廣義的基于樹的處理具有幾個優點。首先,由于樹在內存中是持久的,因此可以修改它以便應用程序能對數據和結構作出更改。它還可以在任何時候在樹中上下導航,而不是像SAX那樣是一次性的處理。DOM使用起來也要簡單得多。

2)SAX

??????? SAX處理的優點非常類似于流媒體的優點。分析能夠立即開始,而不是等待所有的數據被處理。而且,由于應用程序只是在讀取數據時檢查數據,因此不需要將數據存儲在內存中。這對于大型文檔來說是個巨大的優點。事實上,應用程序甚至不必解析整個文檔;它可以在某個條件得到滿足時停止解析。一般來說,SAX還比它的替代者DOM快許多。?
?  選擇DOM還是選擇SAX? 對于需要自己編寫代碼來處理XML文檔的開發人員來說,? 選擇DOM還是SAX解析模型是一個非常重要的設計決策。 DOM采用建立樹形結構的方式訪問XML文檔,而SAX采用的事件模型。?

  DOM解析器把XML文檔轉化為一個包含其內容的樹,并可以對樹進行遍歷。用DOM解析模型的優點是編程容易,開發人員只需要調用建樹的指令,然后利用navigation?APIs訪問所需的樹節點來完成任務。可以很容易的添加和修改樹中的元素。然而由于使用DOM解析器的時候需要處理整個XML文檔,所以對性能和內存的要求比較高,尤其是遇到很大的XML文件的時候。由于它的遍歷能力,DOM解析器常用于XML文檔需要頻繁的改變的服務中。?

  SAX解析器采用了基于事件的模型,它在解析XML文檔的時候可以觸發一系列的事件,當發現給定的tag的時候,它可以激活一個回調方法,告訴該方法制定的標簽已經找到。SAX對內存的要求通常會比較低,因為它讓開發人員自己來決定所要處理的tag。特別是當開發人員只需要處理文檔中所包含的部分數據時,SAX這種擴展能力得到了更好的體現。但用SAX解析器的時候編碼工作會比較困難,而且很難同時訪問同一個文檔中的多處不同數據。

3)JDOM????????? ?http://www.jdom.org/

????????? JDOM的目的是成為Java特定文檔模型,它簡化與XML的交互并且比使用DOM實現更快。由于是第一個Java特定模型,JDOM一直得到大力推廣和促進。正在考慮通過“Java規范請求JSR-102”將它最終用作“Java標準擴展”。從2000年初就已經開始了JDOM開發。

  JDOM與DOM主要有兩方面不同。首先,JDOM僅使用具體類而不使用接口。這在某些方面簡化了API,但是也限制了靈活性。第二,API大量使用了Collections類,簡化了那些已經熟悉這些類的Java開發者的使用。

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

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

4)DOM4J?http://dom4j.sourceforge.NET/?
?????????????
??????? 雖然DOM4J代表了完全獨立的開發結果,但最初,它是JDOM的一種智能分支。它合并了許多超出基本XML文檔表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文檔或流化文檔的基于事件的處理。它還提供了構建文檔表示的選項,它通過DOM4J API和標準DOM接口具有并行訪問功能。從2000下半年開始,它就一直處于開發之中。

  為支持所有這些功能,DOM4J使用接口和抽象基本類方法。DOM4J大量使用了API中的Collections類,但是在許多情況下,它還提供一些替代方法以允許更好的性能或更直接的編碼方法。直接好處是,雖然DOM4J付出了更復雜的API的代價,但是它提供了比JDOM大得多的靈活性。

  在添加靈活性、XPath集成和對大文檔處理的目標時,DOM4J的目標與JDOM是一樣的:針對Java開發者的易用性和直觀操作。它還致力于成為比JDOM更完整的解決方案,實現在本質上處理所有Java/XML問題的目標。在完成該目標時,它比JDOM更少強調防止不正確的應用程序行為。

  DOM4J是一個非常非常優秀的Java?XML API,具有性能優異、功能強大和極端易用使用的特點,同時它也是一個開放源代碼的軟件。如今你可以看到越來越多的Java軟件都在使用DOM4J來讀寫XML,特別值得一提的是連Sun的JAXM也在用DOM4J。?

2.. 比較

1)DOM4J性能最好,連Sun的JAXM也在用DOM4J。目前許多開源項目中大量采用DOM4J,例如大名鼎鼎的hibernate也用DOM4J來讀取XML配置文件。如果不考慮可移植性,那就采用DOM4J.

2)JDOM和DOM在性能測試時表現不佳,在測試10M文檔時內存溢出。在小文檔情況下還值得考慮使用DOM和JDOM。雖然JDOM的開發者已經說明他們期望在正式發行版前專注性能問題,但是從性能觀點來看,它確實沒有值得推薦之處。另外,DOM仍是一個非常好的選擇。DOM實現廣泛應用于多種編程語言。它還是許多其它與XML相關的標準的基礎,因為它正式獲得W3C推薦(與基于非標準的Java模型相對),所以在某些類型的項目中可能也需要它(如在JavaScript中使用DOM)。

3)SAX表現較好,這要依賴于它特定的解析方式-事件驅動。一個SAX檢測即將到來的XML流,但并沒有載入到內存(當然當XML流被讀入時,會有部分文檔暫時隱藏在內存中)。

3. 四種xml操作方式的基本使用方法

?

[java]?view plaincopy
    1. xml文件:??
    2. ??
    3. <?xml?version="1.0"?encoding="utf-8"??>???
    4. <Result>??
    5. ???<VALUE>??
    6. ???????<NO?DATE="2005">A1</NO>??
    7. ???????<ADDR>GZ</ADDR>??
    8. ???</VALUE>??
    9. ???<VALUE>??
    10. ???????<NO?DATE="2004">A2</NO>??
    11. ???????<ADDR>XG</ADDR>??
    12. ??</VALUE>??
    13. </Result>??
    14. ??
    15. 1)DOM??
    16. ??
    17. import?java.io.*;??
    18. import?java.util.*;??
    19. import?org.w3c.dom.*;??
    20. import?javax.xml.parsers.*;??
    21. ??
    22. public?class?MyXMLReader{???
    23.  public?static?void?main(String?arge[]){??
    24. ??
    25.   long?lasting?=System.currentTimeMillis();???
    26.   try{????
    27.    File?f=new?File("data_10k.xml");???
    28.    DocumentBuilderFactory?factory=DocumentBuilderFactory.newInstance();???
    29.    DocumentBuilder?builder=factory.newDocumentBuilder();???
    30.    Document?doc?=?builder.parse(f);???
    31.    NodeList?nl?=?doc.getElementsByTagName("VALUE");???
    32.    for?(int?i=0;i<nl.getLength();i++){???
    33.     System.out.print("車牌號碼:"?+?doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());???
    34.     System.out.println("車主地址:"?+?doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());???
    35.  ? }???
    36.   }catch(Exception?e){???
    37.    e.printStackTrace();???
    38. }??
    39. ??
    40. 2)SAX??
    41. ??
    42. import?org.xml.sax.*;??
    43. import?org.xml.sax.helpers.*;??
    44. import?javax.xml.parsers.*;??
    45. ??
    46. public?class?MyXMLReader?extends?DefaultHandler?{??
    47. ??
    48.  java.util.Stack?tags?=?new?java.util.Stack();???
    49.  public?MyXMLReader()?{???
    50.   super();??
    51. ???}??
    52. ??
    53.  public?static?void?main(String?args[])?{???
    54.   long?lasting?=?System.currentTimeMillis();???
    55.   try?{???
    56.    SAXParserFactory?sf?=?SAXParserFactory.newInstance();???
    57.    SAXParser?sp?=?sf.newSAXParser();???
    58.    MyXMLReader?reader?=?new?MyXMLReader();???
    59.    sp.parse(new?InputSource("data_10k.xml"),?reader);???
    60.   }?catch?(Exception?e)?{???
    61.    e.printStackTrace();???
    62.   }??
    63. ??
    64.   System.out.println("運行時間:"?+?(System.currentTimeMillis()?-?lasting)?+?"毫秒");}???
    65.   public?void?characters(char?ch[],?int?start,?int?length)?throws?SAXException?{???
    66.   String?tag?=?(String)?tags.peek();???
    67.   if?(tag.equals("NO"))?{????
    68.    System.out.print("車牌號碼:"?+?new?String(ch,?start,?length));??
    69. ????}??
    70. ????if?(tag.equals("ADDR"))?{???
    71.   System.out.println("地址:"?+?new?String(ch,?start,?length));??
    72. ????}??
    73. ???}??
    74. ??
    75.   public?void?startElement(String?uri,String?localName,String?qName,Attributes?attrs)?{???
    76.   tags.push(qName);}??
    77. }???
    78. ??
    79. 3)?JDOM??
    80. ??
    81. import?java.io.*;??
    82. import?java.util.*;??
    83. import?org.jdom.*;??
    84. import?org.jdom.input.*;??
    85. ??
    86. public?class?MyXMLReader?{??
    87. ??
    88.  public?static?void?main(String?arge[])?{???
    89.   long?lasting?=?System.currentTimeMillis();???
    90.   try?{???
    91.    SAXBuilder?builder?=?new?SAXBuilder();????
    92.    Document?doc?=?builder.build(new?File("data_10k.xml"));????
    93.    Element?foo?=?doc.getRootElement();????
    94.    List?allChildren?=?foo.getChildren();????
    95.    for(int?i=0;i<allChildren.size();i++)?{????
    96.     System.out.print("車牌號碼:"?+?((Element)allChildren.get(i)).getChild("NO").getText());???
    97.     System.out.println("車主地址:"?+?((Element)allChildren.get(i)).getChild("ADDR").getText());???
    98.    }???
    99.   }?catch?(Exception?e)?{???
    100.    e.printStackTrace();???
    101. }??
    102. ??
    103. }??
    104. ??
    105. 4)DOM4J??
    106. ??
    107. import?java.io.*;??
    108. import?java.util.*;??
    109. import?org.dom4j.*;??
    110. import?org.dom4j.io.*;??
    111. ??
    112. public?class?MyXMLReader?{??
    113. ??
    114.  public?static?void?main(String?arge[])?{???
    115.   long?lasting?=?System.currentTimeMillis();???
    116.   try?{???
    117.    File?f?=?new?File("data_10k.xml");???
    118.    SAXReader?reader?=?new?SAXReader();???
    119.    Document?doc?=?reader.read(f);???
    120.    Element?root?=?doc.getRootElement();???
    121.    Element?foo;???
    122.    for?(Iterator?i?=?root.elementIterator("VALUE");?i.hasNext();)?{???
    123.     foo?=?(Element)?i.next();???
    124.     System.out.print("車牌號碼:"?+?foo.elementText("NO"));???
    125.     System.out.println("車主地址:"?+?foo.elementText("ADDR"));???
    126.    }???
    127.   }?catch?(Exception?e)?{???
    128.    e.printStackTrace();???
    129. ????}???
    130. } ?

轉載于:https://www.cnblogs.com/printN/p/6693189.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393223.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393223.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393223.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php mvc 高性能框架,swoolefy-基于swoole擴展實現的高性能的微服務和mvc框架

swoolefy這是一個基于swoole擴展實現的輕量級高性能的API和Web的MVC微服務框架&#xff0c;參考了TP,Yii2,Workerman&#xff0c;swoole_framework等框架的的設計思想。同時也結合了多年來的技術的積累的以及生產環境中的實踐經驗實現的功能特性1、輕量級的框架,實現路由與調度…

arcore_如何使用ARCore和Android Studio構建增強現實Android應用

arcoreby Ayusch Jain通過Ayusch Jain 如何使用ARCore和Android Studio構建增強現實Android應用 (How to build an Augmented Reality Android App with ARCore and Android Studio) This article was originally posted here本文最初發布在這里 In the previous post, I expl…

最小值的最優化問題

無約束極小值的最優化條件&#xff1a; 關于多元函數極小值點的必要條件&#xff1a; 滿足的點稱之為f(x)的駐點或穩定點&#xff0c;但是反過來&#xff0c;滿足梯度條件的點不一定是f(x)的局部極小值。因此&#xff0c;定理轉化為求解下面的方程組問題&#xff1a; 對于上面…

leetcode950. 按遞增順序顯示卡牌

牌組中的每張卡牌都對應有一個唯一的整數。你可以按你想要的順序對這套卡片進行排序。 最初&#xff0c;這些卡牌在牌組里是正面朝下的&#xff08;即&#xff0c;未顯示狀態&#xff09;。 現在&#xff0c;重復執行以下步驟&#xff0c;直到顯示所有卡牌為止&#xff1a; …

第2課 - 搭建Lua開發環境

第2課 - 搭建Lua開發環境 1. Lua 的優點 &#xff08;1&#xff09;Lua 使用標準的 ANSI C 進行開發&#xff0c;可以無縫集成到宿主程序&#xff0c;且幾乎支持所有平臺。 &#xff08;2&#xff09;Lua 是開源且免費的軟件&#xff0c;以源碼的方式直接發布。開源軟件的發布方…

關于文件系統權限的管理

關于文件系統權限的管理 眾所周知的是&#xff0c;一個操作系統&#xff0c;是需要為不同的用戶進行服務的&#xff0c;因為不能讓每個人都以管理員進行操作&#xff0c;這樣做的話&#xff0c;毫無安全性可言&#xff0c;所以我們需要驗證和授權。這就體現了權限的重要性&…

深度學習工作開展_深入開展深度工作:新經濟中的兩項核心能力

深度學習工作開展by Bar Franek由Bar Franek 深入開展深度工作&#xff1a;新經濟中的兩項核心能力 (Going Deeper on Deep Work: Two Core Abilities for Thriving in the New Economy) 愛深層工作的更多理由 (A Few More Reasons To Love Deep Work) I had no idea my first…

java獲取文件名方法,利用Java獲取文件名、類名、方法名和行號的方法小結

大家都知道&#xff0c;在C語言中&#xff0c;我們可以通過宏FILE、 __LINE__來獲取文件名和行號&#xff0c;而在Java語言中&#xff0c;則可以通過StackTraceElement類來獲取文件名、類名、方法名、行號&#xff0c;具體代碼如下&#xff1a;public static int getLineNumber…

tp5.1升級指導---控制器調整 _initialize方法更改為initialize

控制器調整 為了規范化&#xff0c;繼承了think\Controller類的話&#xff0c;初始化方法從原來的_initialize方法更改為initialize。轉載于:https://www.cnblogs.com/lsyy/p/11027416.html

leetcode537. 復數乘法

給定兩個表示復數的字符串。 返回表示它們乘積的字符串。注意&#xff0c;根據定義 i2 -1 。 示例 1: 輸入: “11i”, “11i” 輸出: “02i” 解釋: (1 i) * (1 i) 1 i2 2 * i 2i &#xff0c;你需要將它轉換為 02i 的形式。 代碼 class Solution {public String c…

初始多態

package Li;public class Person { String name;public Person() {super(); }public Person(String name) {super();this.name name; }public void eat(){System.out.println(name"正在吃面包"); } }package Li;public class Student extends Person {public Studen…

Bitmap尺度變換

1 Bitmap bitMap BitmapFactory.decodeFile(path);2 int width bitMap.getWidth();3 int height bitMap.getHeight();4 // 設置想要的大小5 int newWidth 500;6 int newHeight 400;7 // 計算縮放比例8 float scaleWidth ((float) newWidth) / width;9 float scaleHeight …

css!important_如何解決CSS特殊性問題以及何時使用!important關鍵字

css!importantby Muna Mohamed通過穆納穆罕默德(Muna Mohamed) 如何解決CSS特殊性問題以及何時使用&#xff01;important關鍵字 (How to tackle CSS specificity issues and when to use the !important keyword) 案例研究 (A Case Study) Recently, there was a Twitter pol…

php框架使用教程,php框架laravel excel包使用教程介紹

Laravel是一套簡潔、優雅的PHP Web開發框架(PHP Web Framework)。它可以讓你從面條一樣雜亂的代碼中解脫出來&#xff1b;它可以幫你構建一個完美的網絡APP了&#xff0c;下面我們來看看laravel excel包使用教程laravel中excel插件的安裝在composer中引入laravel excel的包&quo…

(私人收藏)python學習(游戲、爬蟲、排序、練習題、錯誤總結)

python學習(游戲、爬蟲、排序、練習題、錯誤總結) https://pan.baidu.com/s/1dPzSoZdULHElKvb57kuKSgl7bz python100經典練習題python-錯誤和異常小結python-大作業之五子棋游戲&#xff08;附代碼&#xff09;python-網絡爬蟲幾種排序方法python實現新手常見的python運行時錯誤…

leetcode1300. 轉變數組后最接近目標值的數組和

給你一個整數數組 arr 和一個目標值 target &#xff0c;請你返回一個整數 value &#xff0c;使得將數組中所有大于 value 的值變成 value 后&#xff0c;數組的和最接近 target &#xff08;最接近表示兩者之差的絕對值最小&#xff09;。 如果有多種使得和最接近 target 的…

MySQL性能指標及計算方法

MySQL性能指標及計算方法 絕大多數MySQL性能指標可以通過以下兩種方式獲取&#xff1a; &#xff08;1&#xff09;mysqladmin 使用mysqladmin extended-status命令獲得的MySQL的性能指標&#xff0c;默認為累計值。如果想了解當前狀態&#xff0c;需要進行差值計算&#xff1b…

php可變變量講解,PHP可變變量實例詳解

什么是可變變量&#xff1f;在PHP中有一個其他類型的變量&#xff0c;“可變變量”。可變變量是一種PHP獨特的變量&#xff0c;他允許動態改變一個變量的名稱。可變變量的工作原理這個特性的工作原理是用一個變量的值作為另一個變量的名稱。例如&#xff0c;我們可以設置$str的…

Nginx平滑升級到最新版本

&#xff08;一&#xff09;簡述&#xff1a; 早上收到nginx最新漏洞的通知&#xff0c;Nginx官方發布最新的安全公告&#xff0c;在Nginx范圍過濾器中發現了一個安全問題&#xff08;CVE-2017-7529&#xff09;&#xff0c;通過精心構造的惡意請求可能會導致整數溢出并且不…

如何使用TypeScript從Microsoft Word生成GitHub markdown文件

by Manish Bansal通過Manish Bansal What? Why would one want to generate an MD file from a Microsoft word document? If that’s the first thought you had after reading this title, then let me give you a strong use case.什么&#xff1f; 為什么要從Microsoft …