1. 程式人生 > >詳解Java解析XML的四種方法

詳解Java解析XML的四種方法

XML現在已經成為一種通用的資料交換格式,平臺的無關性使得很多場合都需要用到XML。本文將詳細介紹用Java解析XML的四種方法。 XML現在已經成為一種通用的資料交換格式,它的平臺無關性,語言無關性,系統無關性,給資料整合與互動帶來了極大的方便。對於XML本身的語法知識與技術細節,需要閱讀相關的技術文獻,這裡麵包括的內容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XSD(Xml Schema Definition),XSLT(Extensible Stylesheet Language Transformations),具體可參閱w3c官方網站文件http://www.w3.org獲取更多資訊。
XML在不同的語言裡解析方式都是一樣的,只不過實現的語法不同而已。基本的解析方式有兩種,一種叫SAX,另一種叫DOM。SAX是基於事件流的解析,DOM是基於XML文件樹結構的解析。

        Java解析XML主要有四種方法。DOM、SAX、JDOM、DOM4J。

一、DOM解析

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



  另一方面,對於特別大的文件,解析和載入整個文件可能很慢且很耗資源,因此使用其他手段來處理這樣的資料會更好。這些基於事件的模型,比如 SAX。 

  Bean檔案: 

package com.test; 

  import java.io.*; 
  import java.util.*; 
  import org.w3c.dom.*; 
  import javax.xml.parsers.*; 

  public class MyXMLReader{ 

  public static void main(String arge[]){ 
    long lasting =System.currentTimeMillis(); 
    try{ 
     File f=new File("data_10k.xml"); 
     DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder=factory.newDocumentBuilder(); 
     Document doc = builder.parse(f); 
     NodeList nl = doc.getElementsByTagName("VALUE"); 
     for (int i=0;i<nl.getLength();i++){ 
      System.out.print("車牌號碼:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue()); 
      System.out.println(" 車主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue()); 
      } 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    System.out.println("執行時間:"+(System.currentTimeMillis() - lasting)+" 毫秒"); 
    } 
  } 


   10k消耗時間:265 203 219 172 
  100k消耗時間:9172 9016 8891 9000 
  1000k消耗時間:691719 675407 708375 739656 
  10000k消耗時間:OutOfMemoryError

二、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 解析器的時候編碼工作會比較困難,而且很難同時訪問同一個文件中的多處不同資料。 

  Bean檔案: 

package com.test; 
  import org.xml.sax.*; 
  import org.xml.sax.helpers.*; 
  import javax.xml.parsers.*; 

  public class MyXMLReader extends DefaultHandler { 

  java.util.Stack tags = new java.util.Stack(); 

  public MyXMLReader() { 
  super(); 
  } 

  public static void main(String args[]) { 
  long lasting = System.currentTimeMillis(); 
  try { 
   SAXParserFactory sf = SAXParserFactory.newInstance(); 
   SAXParser sp = sf.newSAXParser(); 
   MyXMLReader reader = new MyXMLReader(); 
   sp.parse(new InputSource("data_10k.xml"), reader); 
  } catch (Exception e) { 
   e.printStackTrace(); 
  } 
  System.out.println("執行時間:" + (System.currentTimeMillis() - lasting) + " 毫秒"); 
  } 

  public void characters(char ch[], int start, int length) throws SAXException { 
  String tag = (String) tags.peek(); 
  if (tag.equals("NO")) { 
   System.out.print("車牌號碼:" + new String(ch, start, length)); 
  } 
  if (tag.equals("ADDR")) { 
  System.out.println(" 地址:" + new String(ch, start, length)); 
  } 
  } 

  public void startElement( 
  String uri, 
  String localName, 
  String qName, 
  Attributes attrs) { 
  tags.push(qName); 
  } 
  } 
10k消耗時間:110 47 109 78 
  100k消耗時間:344 406 375 422 
  1000k消耗時間:3234 3281 3688 3312 

  10000k消耗時間:32578 34313 31797 31890 30328

三、JDOM解析

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 許可證變體下發布的開放原始碼。 

  Bean檔案:

package com.test; 

  import java.io.*; 
  import java.util.*; 
  import org.jdom.*; 
  import org.jdom.input.*; 

  public class MyXMLReader { 

  public static void main(String arge[]) { 
  long lasting = System.currentTimeMillis(); 
  try { 
   SAXBuilder builder = new SAXBuilder(); 
   Document doc = builder.build(new File("data_10k.xml")); 
   Element foo = doc.getRootElement(); 
   List allChildren = foo.getChildren(); 
   for(int i=0;i<allChildren.size();i++) { 
    System.out.print("車牌號碼:" + ((Element)allChildren.get(i)).getChild("NO").getText()); 
    System.out.println(" 車主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText()); 
   } 
  } catch (Exception e) { 
   e.printStackTrace(); 
  } 
  System.out.println("執行時間:" + (System.currentTimeMillis() - lasting) + " 毫秒"); 
  } 
  } 
10k消耗時間:125 62 187 94 
  100k消耗時間:704 625 640 766 
  1000k消耗時間:27984 30750 27859 30656 
  10000k消耗時間:OutOfMemoryError

四、DOM4J解析

雖然 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。 

  Bean檔案: 

package com.test; 

  import java.io.*; 
  import java.util.*; 
  import org.dom4j.*; 
  import org.dom4j.io.*; 

  public class MyXMLReader { 

  public static void main(String arge[]) { 
  long lasting = System.currentTimeMillis(); 
  try { 
   File f = new File("data_10k.xml"); 
   SAXReader reader = new SAXReader(); 
   Document doc = reader.read(f); 
   Element root = doc.getRootElement(); 
   Element foo; 
   for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) { 
    foo = (Element) i.next(); 
    System.out.print("車牌號碼:" + foo.elementText("NO")); 
    System.out.println(" 車主地址:" + foo.elementText("ADDR")); 
   } 
  } catch (Exception e) { 
   e.printStackTrace(); 
  } 
  System.out.println("執行時間:" + (System.currentTimeMillis() - lasting) + " 毫秒"); 
  } 
  } 
10k消耗時間:109 78 109 31 
  100k消耗時間:297 359 172 312 
  1000k消耗時間:2281 2359 2344 2469 
  10000k消耗時間:20938 19922 20031 21078

五、XML解析總結

1、【DOM】 DOM是基於樹的結構,通常需要載入整文件和構造DOM樹,然後才能開始工作。 優點:     a、由於整棵樹在記憶體中,因此可以對xml文件隨機訪問     b、可以對xml文件進行修改操作     c、較sax,dom使用也更簡單。 缺點:     a、整個文件必須一次性解析完     a、由於整個文件都需要載入記憶體,對於大文件成本高 2、【SAX】 SAX類似流媒體,它基於事件驅動的,因此無需將整個文件載入記憶體,使用者只需要監聽自己感興趣的事件即可。 優點:     a、無需將整個xml文件載入記憶體,因此消耗記憶體少     b、可以註冊多個ContentHandler 缺點:     a、不能隨機的訪問xml中的節點     b、不能修改文件 3、【JDOM】 JDOM是純Java的處理XML的API,其API中大量使用Collections類, 優點:     a、DOM方式的優點     b、具有SAX的Java規則 缺點     a、DOM方式的缺點 4、【DOM4J】 這4中xml解析方式中,最優秀的一個,集易用和效能於一身。 JDOM 和 DOM 在效能測試時表現不佳,在測試 10M 文件時記憶體溢位。在小文件情況下還值得考慮使用 DOM 和 JDOM。雖然 JDOM 的開發者已經說明他們期望在正式發行版前專注效能問題,但是從效能觀點來看,它確實沒有值得推薦之處。另外,DOM 仍是一個非常好的選擇。DOM 實現廣泛應用於多種程式語言。它還是許多其它與 XML 相關的標準的基礎,因為它正式獲得 W3C 推薦(與基於非標準的 Java 模型相對),所以在某些型別的專案中可能也需要它(如在 JavaScript 中使用 DOM)。 

  SAX表現較好,這要依賴於它特定的解析方式。一個 SAX 檢測即將到來的XML流,但並沒有載入到記憶體(當然當XML流被讀入時,會有部分文件暫時隱藏在記憶體中)。 

  無疑,DOM4J是這場測試的獲勝者,目前許多開源專案中大量採用 DOM4J,例如大名鼎鼎的 Hibernate 也用 DOM4J 來讀取 XML 配置檔案。如果不考慮可移植性,那就採用DOM4J吧!




相關推薦

Java解析XML方法(轉載)

出處:http://developer.51cto.com/art/200903/117512.htm XML現在已經成為一種通用的資料交換格式,它的平臺無關性,語言無關性,系統無關性,給資料整合與互動帶來了極大的方便。對於XML本身的語法知識與技術細節,需要閱讀相關的技術文獻,這裡

Java解析XML方法

XML現在已經成為一種通用的資料交換格式,平臺的無關性使得很多場合都需要用到XML。本文將詳細介紹用Java解析XML的四種方法。 XML現在已經成為一種通用的資料交換格式,它的平臺無關性,語言無關性,系統無關性,給資料整合與互動帶來了極大的方便。對於XML本身的語法知識與

Java解析XML方法—DOM/SAX/jdom/dom4j

        最近在研究XML檔案的生成和解析,網上資料很多,當然也參差不齊。寫的沒錯誤的通常是單獨介紹了1種方法,介紹全的常常執行不起來。         小哆把4種方法彙總了一下,執行驗證成功。     jar包免費下載:     XML在不同的語言裡解析方式都是

Java 常用的鎖機制優缺點

多執行緒的併發問題一直困擾著大家,Java提供了多種多執行緒鎖機制的實現方式,接下來的話題將分為四個部分給大家講解他們的優缺點和原理(Synchronized、ReentrantLock、Semaphore、AtomicInteger),每種機制都有優缺點與各自的適用場景,必須熟練掌握他們的特點才能

xml 解析方法

1  DOM解析 是將這個xml檔案裝入記憶體 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumen

Java 中的三代理模式

繼承 jvm 保存 3.2 指令集 throwable eth args 代理類 代理模式 代理(Proxy)是一種設計模式,提供了對目標對象另外的訪問方式;即通過代理對象訪問目標對象.這樣做的好處是:可以在目標對象實現的基礎上,增強額外的功能操作,即擴展目標

Java中的Object.getClass()方法

詳解Java中的Object.getClass()方法   詳解Object.getClass()方法,這個方法的返回值是Class型別,Class c = obj.getClass(); 通過物件c,我們可以獲取該物件的所有成員方法,每個成員方法都是一個Method物件;我們也可以獲取該物件的

Java解析xml檔案的方法

什麼是 XML? XML指可擴充套件標記語言(EXtensible Markup Language)XML 是一種標記語言,很類似 HTMLXML 的設計宗旨是傳輸資料,而非顯示資料XML 標籤沒有被預定義。您需要自行定義標籤。XML 被設計為具有自我描述性。XML 是

java解析XML方式小結

第一種:DOM。 DOM的全稱是Document Object Model,也即文件物件模型。在應用程式中,基於DOM的XML分析器將一個XML文件轉換成一個物件模型的集合(通常稱DOM樹),應用程式正是通過對這個物件模型的操作,來實現對XML文件資料的操作。通過DOM介面,應用程式可以在任何時候訪問X

php5 的 session 之二:有兩方法傳遞 一個會話 ID:

cookie URL 引數 會話模組支援這兩種方法。cookie 更優化,但由於不總是可用,也提供替代的方法。第二種方法直接將會話 ID 嵌入到 URL 中間去。PHP 可以透明地轉換連線。除非是使用 PHP 4.2 或更低版本,需要手工在編譯PHP 時啟用。在 Unix

Java解析XML方法

package com.alisoft.facepay.framework.bean;  import java.io.FileInputStream;  import java.io.FileNotFoundException;  import java.io.IOException;  import

java解析xml方法

首言 java中解析xml檔案有四種方式,分別是DOM、SAX、JDOM、DOM4J,這四種前兩種是系統自帶的,後兩種需要匯入jar包,其中先要對xml檔案有一個基本的瞭解。xml檔案是為了不同程式,不同平臺之間資料傳輸,不同資料平臺的資料共享的作用。是以樹形結構的儲存的。

Java解析XML方法比較

XML現在已經成為一種通用的資料交換格式,它的平臺無關性,語言無關性,系統無關性,給資料整合與互動帶來了極大的方便。XML在不同的語言裡解析方式都是一樣的,只不過實現的語法不同而已。基本的解析方式有兩種,一種叫SAX,另一種叫DOM。SAX是基於事件流的解析,DOM是基於X

java Map之 遍歷Map的方法及Map.Entry。轉載至https://blog.csdn.net/Darry_R/article/details/78915420

Map是java中的介面,Map.Entry是Map的一個內部介面。          Map提供了一些常用方法,如keySet()、entrySet()等方法,keySet()

批量殺死MySQL連接的方法

如果 詳解 mysql into 連接 進行 0 rows awk sel 方法一   通過information_schema.processlist表中的連接信息生成需要處理掉的MySQL連接的語句臨時文件,然後執行臨時文件中生成的指令。 mysql> selec

對DOM,SAX,JDOM,DOM4J方法解析XML文件的分析

文件加載 四種方法 結束 要求 每次 xml文件 基於 擴展方法 四種 ---恢復內容開始--- 1、DOM   與平臺無關的官方解析方式   DOM是一次性把xml文件加載到內存中,形成一個節點樹   對內存有要求 2、SAX   java提供的基於事件驅動的解

Java 處理 XML方法 -->附:XmlUtils

XML現在已經成為一種通用的資料交換格式,平臺的無關性使得很多場合都需要用到XML。本文將詳細介紹用Java解析XML的四種方法。         XML現在已經成為一種通用的資料交換格式,它的平臺無關性,語言無關性,系統

後端---JAVA解析XML文件的方式

XML解析——Java中XML的四種解析方式 XML是一種通用的資料交換格式,它的平臺無關性、語言無關性、系統無關性、給資料整合與互動帶來了極大的方便。XML在不同的語言環境中解析方式都是一樣的,只不過實現的語法不同而已。   XML的解析方式分為四種: 一.DOM解析 1、JAXP

Java解析XML檔案的方式

1 import javax.xml.parsers.SAXParser; 2 import javax.xml.parsers.SAXParserFactory; 3 4 import org.xml.sax.Attributes; 5 import org.xml.sax

java讀取xml檔案的方法

1 import javax.xml.parsers.SAXParser; 2 import javax.xml.parsers.SAXParserFactory; 3 4 import org.xml.sax.Attributes; 5 import org.x