實例分析jdom和dom4j的使用和區別

  對於xml的解析和生成,咱們在實際應用中用的比較多的是JDOM和DOM4J,下面經過例子來分析二者的區別(在這裏我就不詳細講解怎麼具體解析xml,若是對於xml的解析看不懂的能夠先去看下我以前關於dom跟sax解析xml的隨筆http://www.cnblogs.com/zhi-hao/p/3985720.html,其實理解了解析xml的原理,要想學習jdom跟dom4j就比較簡單了,jdom跟dom4j只是基於底層api的更高級的封裝,而dom和sax是解析xml的底層接口),咱們在使用jdom和dom4j時要導入相應的包,這些包能夠到jdom和dom4j的官網去下載。html

首先經過jdom來生成xmljava

 

 1 package xmlTest;
 2 /**
 3  * @author CIACs
 4  */
 5 import java.io.FileOutputStream;
 6 
 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 Jdom {
13 
14     public static void main(String[] args) throws Exception{
15         Document doc = new Document();
16         Element root = new Element("root");
17         doc.addContent(root);
18     
19         Element name = new Element("name");
20         root.addContent(name);
21         root.setAttribute("author","CIACs").setAttribute("url", "http://www.cnblogs.com/zhi-hao/");
22         name.addContent("CIACs");
23         
24         XMLOutputter out = new XMLOutputter();
25         Format format = Format.getPrettyFormat();
26         format.setIndent("   ");
27         out.setFormat(format);
28         out.output(doc,new FileOutputStream("jdom.xml"));
29         
30     }
31     
32 }

 

生成的xmlapi

1 <?xml version="1.0" encoding="UTF-8"?>
2 <root author="CIACs" url="http://www.cnblogs.com/zhi-hao/">
3    <name>CIACs</name>
4 </root>

這裏生成的xml比較簡單,這是爲了容易理解,簡單的理解了,複雜的其實也就會了。dom

 

接下來經過jdom對xml進行解析ide

 1 package xmlTest;
 2 /**
 3  * @author CIACs
 4  */
 5 import java.io.File;
 6 import java.io.FileOutputStream;
 7 import java.util.List;
 8 
 9 import org.jdom.Attribute;
10 import org.jdom.Document;
11 import org.jdom.Element;
12 import org.jdom.input.SAXBuilder;
13 import org.jdom.output.XMLOutputter;
14 
15 public class Jdom2 {
16 
17     public static void main(String[] args) throws Exception {
18         //經過SAXBuilder解析xml
19         SAXBuilder builder = new SAXBuilder();
20         
21         Document doc = builder.build(new File("jdom.xml"));
22         
23         Element root = doc.getRootElement();
24         
25         System.out.println(root.getName());
26         
27         String name = root.getChild("name").getText();
28         
29         System.out.println("name: "+name);
30         
31         List attrs = root.getAttributes();
32         
33         for(int i = 0; i < attrs.size();i++)
34         {
35             String attrName;
36             String attrValue;
37             Attribute attr = (Attribute)attrs.get(i);
38             attrName = attr.getName();
39             attrValue = attr.getValue();
40             System.out.println(attrName+":"+attrValue);
41 
42         }
43         //刪除屬性url,並保存到jdom2.xml
44         root.removeAttribute("url");
45         
46         XMLOutputter out = new XMLOutputter();
47         out.output(doc, new FileOutputStream("jdom2.xml"));
48 
49         
50     }
51 }

控制檯窗口輸出的結果:性能

寫入jdom2.xml的內容學習

下面是用dom4j來操做xml測試

  1 package xmlTest;
  2 /**
  3  * @author CIACs
  4  */
  5 import java.io.File;
  6 import java.io.FileOutputStream;
  7 import java.util.List;
  8 
  9 import javax.xml.parsers.DocumentBuilder;
 10 import javax.xml.parsers.DocumentBuilderFactory;
 11 
 12 import org.dom4j.Attribute;
 13 import org.dom4j.Document;
 14 import org.dom4j.DocumentFactory;
 15 import org.dom4j.DocumentHelper;
 16 import org.dom4j.Element;
 17 import org.dom4j.io.DOMReader;
 18 import org.dom4j.io.OutputFormat;
 19 import org.dom4j.io.SAXReader;
 20 import org.dom4j.io.XMLWriter;
 21 
 22 public class Dom4j {
 23     public static void main(String[] args) throws Exception {
 24         //建立文檔跟節點
 25         Document doc =  DocumentFactory.getInstance().createDocument();
 26         Element root = DocumentHelper.createElement("root");
 27         doc.setRootElement(root);
 28         
 29         Element name = DocumentHelper.createElement("name");
 30         name.setText("CIACs");
 31         name.addAttribute("age", "22");
 32         root.add(name);
 33         root.addElement("address").addAttribute("province", "guangdong").addElement("country").setText("guangzhou");
 34         
 35         //生成的xml輸出到命令行窗口
 36         OutputFormat format = new OutputFormat("    ",true);
 37         XMLWriter writer = new XMLWriter(format);
 38         writer.write(doc);
 39     
 40         XMLWriter writer2 = new XMLWriter(new FileOutputStream(new File("dom4j.xml")),format);
 41         //生成的xml寫到內存中
 42         writer2.write(doc);
 43         
 44         
 45         System.out.println("-----------經過SAXReader來解析xml文檔-----------");
 46         SAXReader reader = new SAXReader();
 47         Document doc2 = reader.read(new File("dom4j.xml"));
 48         Element root2 = doc2.getRootElement();
 49 
 50         parse(root2);
 51         
 52         System.out.println("---------經過DOMReader來解析xml文檔-------------");
 53         
 54         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
 55         DocumentBuilder db = dbf.newDocumentBuilder();
 56         //當一個程序中引用同名不一樣包的兩個Document,其中一個必需要加包名加以區別
 57         org.w3c.dom.Document doc3 = db.parse(new File("dom4j.xml"));
 58         DOMReader domReader = new DOMReader();
 59         //將JAXP的document轉換爲dom4j的document
 60         Document doc4 = domReader.read(doc3);
 61         //得到根元素的名稱
 62         String rootName = doc4.getRootElement().getName();
 63         System.out.println(rootName);
 64         
 65     }
 66     
 67     public static void parse(Element element)
 68     {
 69         List<Attribute> list = element.attributes();
 70         if(!list.isEmpty())
 71         {
 72         for(Attribute attr:list)
 73         {
 74             System.out.println("屬性:"+attr.getName()+"="+attr.getText());
 75         }
 76         }
 77         List<Element> list2 = element.elements();
 78         for(int i=0;i<list2.size();i++)
 79         {
 80             
 81             
 82             
 83             if(list2.get(i).elements().size()>=1)
 84             {
 85             System.out.println(list2.get(i).getName());
 86             parse(list2.get(i));
 87             }
 88             else
 89             {
 90                 System.out.println(list2.get(i).getName()+": "+list2.get(i).getText());
 91             }
 92             
 93             
 94             List<Attribute> list3 = list2.get(i).attributes();
 95             if(!list3.isEmpty())
 96             {
 97             for(Attribute attr:list3)
 98             {
 99                 System.out.println("屬性:"+attr.getName()+"="+attr.getText());
100             }
101             }
102 
103             
104         }
105         
106     }
107     
108 }
dom4j
  1 package xmlTest;
  2 /**
  3  * @author CIACs
  4  */
  5 import java.io.File;
  6 import java.io.FileOutputStream;
  7 import java.util.List;
  8 
  9 import javax.xml.parsers.DocumentBuilder;
 10 import javax.xml.parsers.DocumentBuilderFactory;
 11 
 12 import org.dom4j.Attribute;
 13 import org.dom4j.Document;
 14 import org.dom4j.DocumentFactory;
 15 import org.dom4j.DocumentHelper;
 16 import org.dom4j.Element;
 17 import org.dom4j.io.DOMReader;
 18 import org.dom4j.io.OutputFormat;
 19 import org.dom4j.io.SAXReader;
 20 import org.dom4j.io.XMLWriter;
 21 
 22 public class Dom4j {
 23     public static void main(String[] args) throws Exception {
 24         //建立文檔跟節點
 25         Document doc =  DocumentFactory.getInstance().createDocument();
 26         Element root = DocumentHelper.createElement("root");
 27         doc.setRootElement(root);
 28         
 29         Element name = DocumentHelper.createElement("name");
 30         name.setText("CIACs");
 31         name.addAttribute("age", "22");
 32         root.add(name);
 33         root.addElement("address").addAttribute("province", "guangdong").addElement("country").setText("guangzhou");
 34         
 35         //生成的xml輸出到命令行窗口
 36         OutputFormat format = new OutputFormat("    ",true);
 37         XMLWriter writer = new XMLWriter(format);
 38         writer.write(doc);
 39     
 40         XMLWriter writer2 = new XMLWriter(new FileOutputStream(new File("dom4j.xml")),format);
 41         //生成的xml寫到內存中
 42         writer2.write(doc);
 43         
 44         System.out.println("-----------經過SAXReader來解析xml文檔-----------");
 45         SAXReader reader = new SAXReader();
 46         Document doc2 = reader.read(new File("dom4j.xml"));
 47         Element root2 = doc2.getRootElement();
 48 
 49         parse(root2);
 50         
 51         System.out.println("---------經過DOMReader來解析xml文檔-------------");
 52         
 53         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
 54         DocumentBuilder db = dbf.newDocumentBuilder();
 55         //當一個程序中引用同名不一樣包的兩個Document,其中一個必需要加包名加以區別
 56         org.w3c.dom.Document doc3 = db.parse(new File("dom4j.xml"));
 57         DOMReader domReader = new DOMReader();
 58         //將JAXP的document轉換爲dom4j的document
 59         Document doc4 = domReader.read(doc3);
 60         //得到根元素的名稱
 61         String rootName = doc4.getRootElement().getName();
 62         System.out.println(rootName);
 63         
 64     }
 65     
 66     public static void parse(Element element)
 67     {
 68         List<Attribute> list = element.attributes();
 69         if(!list.isEmpty())
 70         {
 71         for(Attribute attr:list)
 72         {
 73             System.out.println("屬性:"+attr.getName()+"="+attr.getText());
 74         }
 75         }
 76         List<Element> list2 = element.elements();
 77         for(int i=0;i<list2.size();i++)
 78         {
 79             
 80             if(list2.get(i).elements().size()>=1)
 81             {
 82             System.out.println(list2.get(i).getName());
 83             parse(list2.get(i));
 84             }
 85             else
 86             {
 87                 System.out.println(list2.get(i).getName()+": "+list2.get(i).getText());
 88             }
 89             
 90             List<Attribute> list3 = list2.get(i).attributes();
 91             if(!list3.isEmpty())
 92             {
 93             for(Attribute attr:list3)
 94             {
 95                 System.out.println("屬性:"+attr.getName()+"="+attr.getText());
 96             }
 97             }
 98         }
 99     }
100 }

 

輸出結果ui

 

 

一、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 許可證變體下發布的開放源碼。
二、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。
三、總述 
    JDOM 在性能測試時表現不佳,在測試 10M 文檔時內存溢出。在小文檔狀況下還值得考慮使用 JDOM。
    總的來講DOM4J是最好的,目前許多開源項目中也大量採用 DOM4J,例如大名鼎鼎的 Hibernate 也用 DOM4J 來讀取 XML 配置文件。若是不考慮可移植性,那就採用DOM4J吧!
編碼

相關文章
相關標籤/搜索