(八)XML之JDOM詳解

JDOM是一種使用 XML 的獨特 Java 工具包,用於快速開發 XML 應用程序。它的設計包含 Java 語言的語法乃至語義。

JAXP (用於 XML 語法分析的 Java API)包含了三個軟件包
–org.w3c.dom ,W3C 推薦的用於 XML 標準規劃文檔對象模型的 Java 工具
–org.xml.sax ,用於對 XML 進行語法分析的事件驅動的簡單 API
–javax.xml.parsers ,工廠化工具,允許應用程序開發人員獲得並配置特殊的語法分析器工具. JDOM 能夠替換 org.w3c.dom 軟件包來有計劃地操作 XML 文檔

•JDOM是一個開源項目,它基於樹型結構,利用純JAVA的技術對XML文檔實現解析、生成、序列化以及多種操作。(http://jdom.org)
•JDOM 直接爲JAVA編程服務。它利用更爲強有力的JAVA語言的諸多特性(方法重載、集合概念等),把SAX和DOM的功能有效地結合起來。
•JDOM是用Java語言讀、寫、操作XML的新API函數。在直接、簡單和高效的前提下,這些API函數被最大限度的優化。
•在使用設計上儘可能地隱藏原來使用XML過程中的複雜性。利用JDOM處理XML文檔將是一件輕鬆、簡單的事。
•JDOM 主要用來彌補DOM及SAX在實際應用當中的不足之處。這些不足之處主要在於SAX沒有文檔修改、隨機訪問以及輸出的功能,而對於DOM來說,JAVA程序員在使用時來用起來總覺得不太方便。
•DOM的缺點主要是由於DOM是一個接口定義語言(IDL),它的任務是在不同語言實現中的一個最低的通用標準,並不是爲JAVA特別設計的。
•在 JDOM 中,XML 元素就是 Element 的實例,XML 屬性就是 Attribute 的實例,XML 文檔本身就是 Document 的實例。

1、W3C DOM設計的侷限性

•語言獨立
–DOM 並不是用 Java 語言設計的。雖然這種方法保留了在不同語言中非常相似的 API,它也使那些習慣 Java 語言的程序員感到更麻煩。
–例如:Java 語言內建了一種 String 類,而 DOM 則規範定義了自己的 Text 類。
•嚴格的層次結構
–DOM API 直接沿襲了 XML 規範。在 XML 中,每件東西都是一個結點,因此您能在 DOM 中找到一個幾乎每件東西都可以擴展的基於 Node 的接口和返回 Node 的一系列方法。
–就多態性的觀點來講,它是優秀的,但鑑於如上解釋,它在 Java 語言中的應用是困難而且不便的,其中從 Node 向葉類型作顯式向下類型轉換會導致代碼的冗長和難以理解。
•接口驅動
–公共 DOM API 僅由接口組成。w3c 對提供實現並不感興趣,它只對定義接口(比較有意義)感興趣。但它也意味着作爲 Java 程序員使用 API 在創建 XML 對象時增加了負擔,因爲 w3c 標準大量使用工廠化的類和類似的靈活的但不直接的模式。
–在某些應用中,XML 文檔是僅由語法分析器建立的,而從不會由應用程序級代碼建立,這是不相關的。但是,隨着 XML 更廣泛的使用,並不是所有問題都繼續需要由語法分析器來驅動。應用程序的開發人員需要一個更方便的方法有計劃地構造 XML 對象。
•對於程序員,這些約束意味着龐大(在內存佔用和接口大小方面)的和難掌握的 API,學習和使用都很難。
•JDOM 是作爲一種輕量級 API 被制定的,最主要的是它是以 Java 爲中心的。它在遵循 DOM 主要規則的基礎上除去了上述缺點
•JDOM 是 Java 平臺專用的。
–只要有可能,API 都使用 Java 語言的內建 String 支持,因此文本值也適用於 String 。它還可利用 Java 2 平臺的類集,如 List 和 Iterator ,給程序員提供了一個豐富的並且和 Java 語言類似的環境。
•沒有層次性。
–在 JDOM 中,XML 元素就是 Element 的實例,XML 屬性就是 Attribute 的實例,XML 文檔本身就是 Document 的實例。由於在 XML 中所有這些都代表了不同的概念,因此它們總是作爲自己的類型被引用,而不是作爲一個含糊的“結點”。
•類驅動。
–因爲 JDOM 對象就是像 Document 、 Element 和 Attribute 這些類的直接實例,因此創建一個新 JDOM 對象就如在 Java 語言中使用 new 操作符一樣容易。它還意味着不需要進行工廠化接口配置 -- JDOM 的使用是直截了當的。

2、JDOM

•因爲 JDOM 對象就是像 Document、Element 和 Attribute 這些類的直接實例,因此創建一個新 JDOM 對象就如在 Java 語言中使用 new 操作符一樣容易。JDOM 的使用是直截了當的。
•JDOM 使用標準的 Java 編碼模式。只要有可能,它使用 Java new 操作符而不使用複雜的工廠模式,使對象操作即便對於初學用戶也很方便。
•JDOM是由以下幾個包組成的
–org.jdom包含了所有的xml文檔要素的java類
–org.jdom.adapters包含了與dom適配的java類
–org.jdom.filter包含了xml文檔的過濾器類
–org.jdom.input包含了讀取xml文檔的類
–org.jdom.output包含了寫入xml文檔的類
–org.jdom.transform包含了將jdomxml文檔接口轉換爲其他xml文檔接口
–org.jdom.xpath包含了對xml文檔xpath操作的類

•org.jdom這個包裏的類是你解析xml文件後所要用到的所有數據類型。
–Attribute
–CDATA
–Coment
–DocType
–Document
–Element
–EntityRef
–Namespace
–ProscessingInstruction
–Text

•輸入類,一般用於文檔的創建工作
–SAXBuilder
–DOMBuilder
–ResultSetBuilder

3、使用JDOM生成一個XML文檔

[java] view plain copy
  1. import java.io.FileNotFoundException;  
  2. import java.io.FileOutputStream;  
  3. import java.io.IOException;  
  4.   
  5. import org.jdom.Attribute;  
  6. import org.jdom.Comment;  
  7. import org.jdom.Document;  
  8. import org.jdom.Element;  
  9. import org.jdom.output.Format;  
  10. import org.jdom.output.XMLOutputter;  
  11.   
  12. public class JDomTest1  
  13. {     
  14.     public static void main(String[] args) throws Exception  
  15.     {  
  16.         Document document = new Document();  
  17.         Element root = new Element("root");  
  18.         document.addContent(root);  
  19.           
  20.         Comment comment = new Comment("this is comment");  
  21.         root.addContent(comment);  
  22.           
  23.         Element e = new Element("hello");  
  24.         root.addContent(e);  
  25.           
  26.         e.setAttribute("sohu""com");  
  27.           
  28.         Element e2 = new Element("world");  
  29.         Attribute attr = new Attribute("test","cesce");  
  30.         e2.setAttribute(attr);  
  31.         e.addContent(e2);  
  32.           
  33.         e2.addContent(new Element("abc").setAttribute("a","aaa")  
  34.                 .setAttribute("b","bbb").setAttribute("ha","ccccc")  
  35.                 .setText("this is a test"));  
  36.           
  37.         Format format = Format.getPrettyFormat();  
  38.         format.setIndent("    ");  
  39.           
  40.         XMLOutputter out = new XMLOutputter(format);  
  41.           
  42.         out.output(document,new FileOutputStream("jdom.xml"));  
  43.           
  44.     }  
  45. }  


使用JDOM解析一個XML文檔並對文檔進行操作

[java] view plain copy
  1. import java.io.File;  
  2. import java.io.FileWriter;  
  3. import java.util.List;  
  4.   
  5. import org.jdom.Attribute;  
  6. import org.jdom.Document;  
  7. import org.jdom.Element;  
  8. import org.jdom.input.SAXBuilder;  
  9. import org.jdom.output.Format;  
  10. import org.jdom.output.XMLOutputter;  
  11.   
  12. public class JDomTest2  
  13. {  
  14.     public static void main(String[] args) throws Exception  
  15.     {  
  16.         SAXBuilder builder = new SAXBuilder();  
  17.           
  18.         Document doc = builder.build(new File("jdom.xml"));  
  19.           
  20.         Element element = doc.getRootElement();  
  21.           
  22.         System.out.println(element.getName());  
  23.           
  24.         Element hello = element.getChild("hello");  
  25.         System.out.println("hello:" + hello.getText());  
  26.           
  27.         List list = hello.getAttributes();  
  28.           
  29.         for(int i = 0;i < list.size();i++)  
  30.         {  
  31.             Attribute attr = (Attribute)list.get(i);  
  32.             String attrName = attr.getName();  
  33.             String attrValue = attr.getValue();  
  34.             System.out.println(attrName + "=" + attrValue);  
  35.         }  
  36.         hello.removeChild("world");  
  37.           
  38.         XMLOutputter out = new XMLOutputter(Format.getPrettyFormat().setIndent("    "));  
  39.         out.output(doc, new FileWriter("jdom1.xml"));  
  40.     }  
  41. }  

 

4、•org.jdom.output輸出類,用於文檔轉換輸出
–XMLOutputter
–SAXOutputter
–DomOutputter
–JTreeOutputter

•Document類
•Document的操作方法:
•Element root = new Element("GREETING");
•Document doc = new Document(root);
•root.setText("Hello JDOM!");
•或者簡單的使用
•Document doc = new Document(new Element("GREETING").setText("Hello JDOM!t"));

•這點和DOM不同。Dom則需要更爲複雜的代碼,如下:
•DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
•DocumentBuilder builder =factory.newDocumentBuilder();
•Document doc = builder.newDocument();
•Element root =doc.createElement("root");
•Text text = doc.createText("This is the root");
•root.appendChild(text);
•doc.appendChild(root);

•可以使用SAXBuilder的build方法來解析一個流從而得到一個Document對象
–Document build(java.io.File file)
–Document build(org.xml.sax.InputSource in)
–Document build(java.io.InputStream in)
–Document build(java.io.InputStream in, java.lang.String systemId)
–Document build(java.io.Reader characterStream)
–Document build(java.io.Reader characterStream, java.lang.String systemId)
–Document build(java.lang.String systemId)
–Document build(java.net.URL url)

•DOM的Document和JDOM的Document之間的相互轉換使用方法
–DOMBuilder builder = new DOMBuilder();
–org.jdom.Document jdomDocument = builder.build(domDocument);
–DOMOutputter converter = new DOMOutputter();// work with the JDOM document…
–org.w3c.dom.Document domDocument = converter.output(jdomDocument);
–// work with the DOM document…

•XMLOutPutter類:
•JDOM的輸出非常靈活,支持很多種io格式以及風格的輸出
•Document doc = new Document(...);
•XMLOutputter outp = new XMLOutputter();
•outp.output(doc, fileOutputStream); // Raw output
•outp.setTextTrim(true); // Compressed output
•outp.output(doc, socket.getOutputStream());
•outp.setIndent(" ");// Pretty output
•outp.setNewlines(true);
•outp.output(doc, System.out);

JDOM使用方法鏈的編程風格。

對於JDOM的Format類的getRawFormat方法,通常用於xml數據的網絡傳輸,因爲這種格式會去掉所有不必要的空白,因此能夠減少網絡傳輸的數據量。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章