標籤:

常用 XML 解析技術

Java 是一個開源的語言,本文將給大家介紹一下常用的 XML 解析框架及特點。

  • XML 的簡介及一些常見概念

  • Java 內置解析 XML API: DOM、SAX

  • XML 解析框架 JDOM

  • XML 解析框架 DOM4J

  • XML 解析框架 XStream

  • 總結

  • XML 的簡介及一些常見概念

    XML 的概念

    XML 是 Extensible Markup Language 簡稱,中文翻譯為可擴展標記語言。XML 是一種通用的數據交換格式,它的平台無關性、語言無關性、系統無關性,給數據集成與交互帶來了極大的方便。XML 在不同的語言環境中解析方式都是一樣的,只不過實現的語法不同而已。

    XML 可用來描述數據、存儲數據、傳輸數據/交換數據。

    XML 文檔節點的類型主要有:

    1. document:文檔,代表整個文檔(DOM 樹的根節點);

    2. element:元素,表示一個元素;

    3. attribute:屬性,代表一個屬性;

    4. PCDATA(Parsed Character Data):文本;

    5. comment:注釋,代表一個注釋;

    6. DOCTYPE:主要驗證文檔內容的正確性;

    7. ENTITIES:實體;

    8. CDATA(Character Data):代表文檔中的 CDATA 區段,文本不會被解析器解析。

    XML 的基本語法

    在使用過程中,請記住以下幾個基本語法。

  • 聲明格式,如下:

  • <>xml version="1.0" encoding="UTF-8"?>

  • 根節點:必須有一個根節點。

  • 標籤:標籤必須有結束且區分大小寫,標籤必須順序嵌套。

  • 屬性:必須使用引號引起值。

  • 空格會被保留。

  • 命名規則:命名必須見名知意。

  • 名字可包含字母、數字以及其他的字元。

  • 名字不能以數字或者標點符號開始。

  • 名字不能以字元「xml」(或者 XML、Xml)開始。

  • 名字不能包含空格。

  • 不應在 XML 元素名稱中使用「:」 ,這是由於它用於命名空間(NameSpaces)的保留字。

  • 標籤優先於屬性。

  • XML 命名空間可提供避免元素命名衝突的方法。

  • CDATA:字元數據,,字元數據不進行轉義。

  • 實體:使用方式為「&實體;」,XML 中有5個預定義的實體,如下表所示。

  • XML 約束注釋:在 XML 中,只有字元 "<" 和="" "&"="">

    1.XML DTD 約束

    DTD 是 DocType Definition 的簡稱,中文翻譯為文檔類型定義,DTD 的作用是定義 XML 文檔的合法構建模塊。它使用一系列的合法元素來定義文檔結構,用於約定 XML 的格式。規定了文檔中所使用的元素、實體、元素的屬性、元素與實體之間的關係。

    DTD主要作用有:

  • 使用 DTD 可以提供一種統一的格式。

  • XML 的可擴展性為文檔的作者提供了很高的靈活性,可有時候需要的是統一,要求某一類文檔具有相同的結構。

  • 使用 DTD 可以保證數據交流和共享的順利進行。

  • DTD 使用戶能夠不依賴具體的數據就知道文檔的邏輯結構。

  • 在沒有 XML 文檔的時候,也可以根據 DTD 為 XML 文檔編寫樣式單,編寫處理程序,這樣可以有效地提高工作效率。

  • 使用 DTD 可以驗證數據的有效性。

  • DTD 對文檔的邏輯結構進行了約束,這種約束可以比較寬鬆,也可以十分嚴格。可以根據 DTD 檢查數據,以驗證其是否符合規定和要求,這可以保證數據的正確和有效。

    DTD 主要定義方式:

    (1)內部定義法,DTD 文件放在 XML 文件內部。

    請看下面的例子,book.xml:

    <>xml version="1.0" encoding="UTF-8" ?> ]> bookstore> book> bookname>帶你飛培訓教程bookname> author>huangjinjinauthor> price>1.00元price> book> book> bookname>降龍十八講秘籍bookname> author>洪七公author> price>0.01元price> book> bookstore>

    (2)外部定義,請看下面這個例子。

    bookstore.dtd:

    <>xml version="1.0" encoding="UTF-8"?> ]>

    book.xml:

    <>xml version="1.0" encoding="UTF-8" ?> bookstore> book> bookname>帶你飛培訓教程bookname> author>huangjinjinauthor> price>1.00元price> book> book> bookname>降龍十八講秘籍bookname> author>洪七公author> price>0.01元price> book> bookstore>

    2.XML Schema 約束

    XML Schema 是基於 XML DTD 的替代者,XML Schema 描述 XML 文檔的結構。XML Schema 語言也稱作 XML Schema 定義(XML Schema Definition 簡稱 XSD)。DTD 不是通過 XML 語法定義文檔結構,不能定義數據類型和限制;Schema 通過 XML 語法定義文檔結構,可以定義數據類型和限制。

    XML Schema 對 XML 文件的主要約定有:

  • 定義可出現在 XML 文檔中的元素;

  • 定義可出現在 XML 文檔中的屬性;

  • 定義哪個元素是子元素;

  • 定義子元素的次序;

  • 定義子元素的數目;

  • 定義元素是否為空,或者是否可包含文本;

  • 定義元素和屬性的數據類型;

  • 定義元素和屬性的默認值以及固定值。

  • 為何使用 Schema,原因有幾下幾點:

  • XML Schema 可針對未來的需求進行擴展;

  • XML Schema 更完善,功能更強大;

  • XML Schema 基於 XML 編寫;

  • XML Schema 支持數據類型和限制;

  • XML Schema 支持命名空間。

  • 我們看下面這個例子。

    book.xsd 文件:

    <>xml version="1.0" encoding="UTF-8"?> schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.mybook.org/BookSchema" xmlns:tns="http://www.mybook.org/BookSchema" elementFormDefault="qualified"> element name="bookstore"> complexType> sequence maxOccurs="unbounded"> element name="book"> complexType> sequence> element name="bookname" type="string" /> element name="author" type="string" /> element name="price" type="string" /> sequence> attribute name="id" type="string">attribute> complexType> element> sequence> complexType> element> schema>

    book.xml

    <>xml version="1.0" encoding="UTF-8" ?> bookstore xmlns="http://www.w3.org/2001/XMLSchema-instance" xmlns:nsbook="http://www.mybook.org/BookSchema" nsbook:schemaLocation="http://www.mybook.org/BookSchema book.xsd"> book id="1"> bookname>帶你飛培訓教程bookname> author>huangjinjinauthor> price>1.00元price> book> book id="2"> bookname>降龍十八講秘籍bookname> author>洪七公author> price>0.01元price> book> bookstore>

    Java 內置解析 XML API: DOM、SAX

    DOM

    DOM的全稱是 Document Object Model,即文檔對象模型,W3C 組織推薦處理 XML 的一種方式。在應用程序中,基於 DOM 的 XML 分析器將一個 XML 文檔轉換成一個對象模型的集合(通常稱 DOM 樹),應用程序正是通過對這個對象模型的操作,來實現對 XML 文檔數據的操作。通過 DOM 介面,應用程序可以在任何時候訪問 XML 文檔中的任何一部分數據,因此這種利用 DOM 介面的機制也被稱作隨機訪問機制。

    DOM 介面提供了一種通過分層對象模型來訪問 XML 文檔信息的方式,這些分層對象模型依據 XML 的文檔結構形成了一棵節點樹。無論 XML 文檔中所描述的是什麼類型的信息,即便是製表數據、項目列表或一個文檔,利用 DOM 所生成的模型都是節點樹的形式。也就是說 DOM 強制使用樹模型來訪問 XML 文檔中的信息。由於 XML 本質上就是一種分層結構,所以這種描述方法是相當有效的。

    DOM 樹所提供的隨機訪問方式給應用程序的開發帶來了很大的靈活性,它可以任意地控制整個 XML 文檔中的內容。然而,由於 DOM 分析器把整個 XML 文檔轉化成 DOM 樹放在了內存中,因此當文檔比較大或者結構比較複雜時,對內存的需求就比較高。而且對於結構複雜的樹的遍歷也是一項耗時的操作。所以 DOM 分析器對機器性能的要求比較高,實現效率不十分理想。

    不過,由於 DOM 分析器所採用的樹結構的思想與 XML 文檔的結構相吻合,同時鑒於隨機訪問所帶來的方便,因此 DOM 分析器還是有很廣泛的使用價值的。

    其優點主要有:

    1. 形成了樹結構,有助於更好的理解、掌握,且代碼容易編寫。

    2. 解析過程中,樹結構保存在內存中,方便修改。

    其缺點主要有:

    1. 由於文件是一次性讀取,所以對內存的耗費比較大。

    2. 如果 XML 文件比較大,容易影響解析性能且可能會造成內存溢出。

    DOM 操作 XML 例子,請見下面代碼:

    // 創建一個DocumentBuilderFactory的對象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // 創建一個DocumentBuilder的對象 try { // 創建DocumentBuilder對象 DocumentBuilder db = dbf.newDocumentBuilder(); // 通過DocumentBuilder對象的parser方法載入books.xml文件到當前項目下 Document document = db.parse("C:\Users\Administrator\Desktop\xmlchat\xml-chat\src\test\resources\3.xml"); // 獲取所有book節點的集合 NodeList bookList = document.getElementsByTagName("book"); // 通過nodelist的getLength()方法可以獲取bookList的長度 System.out.println("一共有" + bookList.getLength() + "本書"); // 遍歷每一個book節點 for (int i = 0; i < booklist.getlength();="" i++)="" {="" ="" ="" ="" ="" ="">out.println("=================下面開始遍歷第" + (i + 1) + "本書的內容================="); // 通過 item(i)方法 獲取一個book節點,nodelist的索引值從0開始 Node book = bookList.item(i); // 獲取book節點的所有屬性集合 NamedNodeMap attrs = book.getAttributes(); System.out.println("第 " + (i + 1) + "本書共有" + attrs.getLength() + "個屬性"); // 遍歷book的屬性 for (int j = 0; j < attrs.getlength();="" j++)="" {="" ="" ="" ="" ="" ="" ="" ="">// 通過item(index)方法獲取book節點的某一個屬性 Node attr = attrs.item(j); // 獲取屬性名 值 System.out.print("屬性名:" + attr.getNodeName()+", 屬性值" + attr.getNodeValue()); } // 解析book節點的子節點 NodeList childNodes = book.getChildNodes(); // 遍歷childNodes獲取每個節點的節點名和節點值 System.out.println("第" + (i + 1) + "本書共有" + childNodes.getLength() + "個子節點"); for (int k = 0; k < childnodes.getlength();="" k++)="" {="" ="" ="" ="" ="" ="" ="" ="">// 區分出text類型的node以及element類型的node if (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) { // 獲取了element類型節點的節點名 System.out.print("第" + (k + 1) + "個節點的節點名:" + childNodes.item(k).getNodeName()); // 獲取了element類型節點的節點值 System.out.println("--節點值是:" + childNodes.item(k).getFirstChild().getNodeValue()); } } System.out.println("======================結束遍歷第" + (i + 1) + "本書的內容================="); } } catch (Exception e) { e.printStackTrace(); }

    閱讀全文請掃描

    下方二維碼,

    還可以加入讀者圈與作者聊天~:


    推薦閱讀:

    釣草洞技術
    從技術員到總理:溫家寶總理昔日老照片
    DSG到底是什麼技術
    2011年第13期技術講座:sumif和countif函數應用
    找女人是門技術活,智慧男人必看!

    TAG:技術 | 解析 |