1. 程式人生 > 其它 >Java解析XML檔案的方法有哪些?對比如何?

Java解析XML檔案的方法有哪些?對比如何?

DOM

DOM 是 W3C 處理 XML 的標準 API,它是許多其它與 XML 處理相關的標準的基礎,不僅是 Java,其它諸如 Javascript,PHP,MS .NET 等等語言都實現了該標準, 成為了應用最為廣泛的 XML 處理方式。當然,為了能提供更多更加強大的功能,Java 對於 DOM 直接擴充套件工具類有很多,比如很多 Java 程式設計師耳熟能詳的 JDOM,DOM4J 等等, 它們基本上屬於對 DOM 介面功能的擴充,保留了很多 DOM API 的特性,許多原本的 DOM 程式設計師甚至都沒有任何障礙就熟練掌握了另外兩者的使用,直觀、易於操作的方式使它深受廣大 Java 程式設計師的喜愛。

DOM方式解析XML檔案的步驟

1.從xml獲得生成DOM物件樹的解析器

語句:

DocumentBuilderFactory docbf = DocumentBuilderFactory.newInstance();

2.獲得Doucument的生成器,可以利用解析器的newDocumentBuilder()獲得示例

語句:

DocumentBuilder docb = docbf.newDocumentBuilder();

3.用DocumentBuilder的parse()解析xml檔案獲得Doucment物件。

語句:

Document doc = docb.parse(“ProfessionalBooks.xml”);

4.獲得當前節點的所有子節點

NodeList nodes = doc.getChildNodes();

5.由於xml是是樹狀結構,所以要寫個函式遍歷樹。

public static void ReadTreeStructure(NodeList nodes) {

// 遍歷所有子節點

for (int i = 0; i < nodes.getLength(); i++) {

// 獲得位元組點名,判斷子節點的型別,區分出text型別的node以及element型別的node

if (nodes.item(i).getNodeType() == Node.ELEMENT_NODE) {

System.out.print(“該節點的名稱為:” + nodes.item(i).getNodeName() + ” “);

String value = ((Text) (nodes.item(i).getFirstChild())).getData().trim();

if (value.getBytes().length != 0) {

System.out.print(“該節點的值為:” + value);

}

System.out.println();

System.out.println();

}

// 獲得子節點的值,如果沒有就不輸出

// 如果子節點還有子節點就繼續往下層讀

if (nodes.item(i).getChildNodes().getLength() != 0) {

ReadTreeStructure(nodes.item(i).getChildNodes());

}

}

}

SAX

SAX 的應運而生有它特殊的需要,為什麼說它綠色環保呢,這是因為 SAX 使用了最少的系統資源和最快速的解析方式對 XML 處理提供了支援。 但隨之而來繁瑣的查詢方式也給廣大程式設計師帶來許多困擾,常常令人頭痛不已,同時它對 XPath 查詢功能的支援,令人們對它又愛又恨。

SAX方法解析XML檔案時需要一個Handler類來提供解析的方法,ssl證書申請

第一步首先生成一個xml解析工廠物件 如:SAXParserFactory factory = SAXParserFactory.newInstance();

然後利用這個工廠物件生成一個 xml解析物件 :XMLParser parser=factory.newSAXParser();

然後利用這個解析物件生成一個XMLReader物件: XMLReader reader=parser.getXMLReader();

然後設定 reade 物件的contentHandler :reader.setContentHandler(***); 注意這個方法的引數是一個繼承了DefaulHandler的類。

最後利用reader物件進行解析:reader.parse(***)這個方法的引數是一個InputSource物件,主要是吧要解析的字串傳進去。

Digester/JAXB

Digester 是 apache 基金組織下的一個開源專案,筆者對它的瞭解源於對 Struts 框架的研究,是否有很多程式設計師想要一解各大開源框架的設計甚至想要自己寫一個功能強大的框架時會碰到這樣一個難題: 這些形形色色的用 XML 語言標記的框架配置檔案,框架底層是用什麼技術來解析呢? DOM 解析耗費時間,SAX 解析又過於繁瑣,況且每次解析系統開銷也會過大, 於是,大家想到需要用與 XML 結構相對應的 JavaBean 來裝載這些資訊,由此 Digester 應運而生。它的出現為 XML 轉換為 JavaBean 物件的需求帶來了方便的操作介面,使得更多的類似需求得到了比較完美的解決方法, 不再需要程式設計師自己實現此類繁瑣的解析程式了。與此同時 SUN 也推出了 XML 和 JavaBean 轉換工具類 JAXB,有興趣的讀者可以自行了解。

工作原理如下:

Digester底層採用SAX(Simple API for XML)析XML檔案,所以很自然的,物件轉換由”事件”驅動,在遍歷每個節點時,檢查是否有匹配模式,如果有,則執行規則定義的操作,比如建立特定的Java物件,或呼叫特定物件的方法等。此處的XML元素根據匹配模式(matching pattern)識別,而相關操作由規則(rule)定義。

如下xml程式碼,右邊是左邊元素對應的匹配模式:

[xhtml] view plain copy

<datasources> ‘datasources’

<datasource> ‘datasources/datasource’

<name/> ‘datasources/datasource/name’

<driver/> ‘datasources/datasource/driver’

</datasource>

<datasource> ‘datasources/datasource’

<name/> ‘datasources/datasource/name’

<driver/> ‘datasources/datasource/driver’

</datasource>

</datasources>

三種解析方式比較

DOM

優缺點:實現 W3C 標準,有多種程式語言支援這種解析方式,並且這種方法本身操作上簡單快捷,十分易於初學者掌握。其處理方式是將 XML 整個作為類似樹結構的方式讀入記憶體中以便操作及解析,因此支援應用程式對 XML 資料的內容和結構進行修改,但是同時由於其需要在處理開始時將整個 XML 檔案讀入到記憶體中去進行分析,因此其在解析大資料量的 XML 檔案時會遇到類似於記憶體洩露以及程式崩潰的風險,請對這點多加註意。

適用範圍:小型 XML 檔案解析、需要全解析或者大部分解析 XML、需要修改 XML 樹內容以生成自己的物件模型

SAX

SAX 從根本上解決了 DOM 在解析 XML 文件時產生的佔用大量資源的問題。其實現是通過類似於流解析的技術,通讀整個 XML 文件樹,通過事件處理器來響應程式設計師對於 XML 資料解析的需求。由於其不需要將整個 XML 文件讀入記憶體當中,它對系統資源的節省是十分顯而易見的,它在一些需要處理大型 XML 文件以及效能要求較高的場合有起了十分重要的作用。支援 XPath 查詢的 SAX 使得開發人員更加靈活,處理起 XML 來更加的得心應手。但是同時,其仍然有一些不足之處也困擾廣大的開發人員:首先是它十分複雜的 API 介面令人望而生畏,其次由於其是屬於類似流解析的檔案掃描方式,因此不支援應用程式對於 XML 樹內容結構等的修改,可能會有不便之處。

適用範圍:大型 XML 檔案解析、只需要部分解析或者只想取得部分 XML 樹內容、有 XPath 查詢需求、有自己生成特定 XML 樹物件模型的需求

Digester/JAXB

優缺點 : 由於其是在上述兩者的基礎上衍生出來的工具類,為的是滿足將 XML 轉換為 JavaBean 的特殊需求,故而沒有什麼特別明顯的優缺點。作為大名鼎鼎的開源框架 Struts 的 XML 解析工具 Digester,為我們帶來了將 XML 轉換為 JavaBean 的可靠方法。

適用範圍 : 有將 XML 文件直接轉換為 JavaBean 需求。