java DOM4J操作XML例子以及DOM、SAX、JDOM、DOM4J的區別

1.介紹

     XML(extensible markup language)可擴展標記語言,無所不在。XML 是各種應用程序之間進行數據傳輸的最常用的工具,並且在信息存儲和描述領域變得越來越流行。

     在java中常見的有四種解析XML的方式 DOM、SAX、JDOM、DOM4J。下面方便簡單介紹下,最後會有一個DOM4J解析、修改XML的例子,因爲DOM4J是目前這4種方法裏性能最好,功能最強、最經常使用的。

 2.DOM

DOM(document object model)是html和xml的應用程序接口(API),以層次結構(類似於樹型)來組織節點和信息片段,映射XML文檔的結構,允許解析和操作文檔的任意部分,是W3C的官方標準

優點:1.允許應用程序對數據和結構做出更改;

            2.訪問是雙向的,可以在任何時候在樹中上下導航,獲取和操作任意部分的數據;

缺點:1.在解析前需要把整個XML文檔載入內存,比較耗內存;

            2.性能不好;

            3.操作起來比較繁瑣

3.SAX

Sax(simple API for XML)擁有通過事件驅動API,每發現一個節點就引發一個事件,事件推給事件處理器,通過回調方法完成解析工作,SAX只能解析XML不能對XML進行修改刪除操作。

優點:1.SAX在某些方面要優於DOM,在內存使用方面比DOM少,因爲它不需要把整個XML文件載入內存;

            2.相對於DOM解析器,SAX的解析效率更高,可以解析大於系統內存的文件;

缺點:1.單向導航,無法定位文檔層次,很難同時訪問同一文檔的不同部分數據,不支持XPath。

4.JDOM

JDOM(java document object model)Java特定的文檔對象模型。自身不包含解析器,一般使用SAX解析xml。使用時需要映入jdom.jar包 。

優點:1.使用具體類而不是接口,簡化了DOM的API;
            2.大量使用了Java集合類,方便了Java開發人員;

            3.速度快

缺點:1.不能處理大於內存的文檔;

            2.靈活性不高

5.DOM4J

Dom4j(documentobject model for java)是個非常優秀的Java XML API,具有性能優異、功能強大和極端易用使用的特點,是dom4j.org出品的一個開源XML解析包,一個易用的、開源的庫,用於XML,XPath和XSLT。它應用於Java平臺,採用了Java集合框架並完全支持DOM,SAX和JAXP。

現在很多java軟件都使用DOM4J解析XML,包括hibernate。

使用DOM4J時需要導入DOM4J.jar 和jaxen.jar兩個包,

(如果沒有導入jaxen.jar包,而在代碼中使用了selectNodes()會報java.lang.NoClassDefFoundError: org/jaxen/JaxenException錯誤


DOM4J解析、修改XML的例子:(關於xpath的用法可以點擊看這裏

xml文件

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="students.xsl"?>
<students> 
    <student sn="01"  flag="ok">
       <name>sam</name>
       <age>18</age>
    </student>
    <student sn="01">
       <name>sam</name>
       <age>18</age>
    </student>
    <student sn="02">
       <name>lin</name>
       <age>20</age>
    </student>
    <s>ss</s>
    <complex att="att1">
      <node1>node1</node1>
    </complex>
</students>

java代碼:

package com.dxswzj.dom;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class xmlCRUDDOM4J {
	public void modifyDocument(File inputXml) {
	       try {
	           SAXReader saxReader = new SAXReader();
	           Document document = saxReader.read(inputXml);
	           Node node = document.selectSingleNode("//students/s");
	           System.out.println(node.getText());
	           
	           
	           Node node2 = document.selectSingleNode("//students/complex");
	           node2.setName("ff");//修改節點的名稱
	           
	          //查詢節點爲student 屬性sn=“01”的節點, 如果過濾多個屬性的話 這樣寫 "//students/student[@sn='01' and @flag='ok']" 
	           List list0 = document.selectNodes("//students/student[@sn='01']");
	           Iterator iter0 = list0.iterator();
	           while(iter0.hasNext()){
	        	   Element elm = (Element)iter0.next();
	        	   Iterator iterAge = elm.elementIterator("age");
	        	   while(iterAge.hasNext()){
	        		   Element elmAge = (Element)iterAge.next();
	        		   elmAge.setText("202");
	        	   }
	           }
	           
	           //後面加個@標示是找屬性的 list裏保存是屬性 迭代的時候 Attribute attribute = (Attribute) iter.next();
	           List list = document.selectNodes("//students/student/@sn");
	           Iterator iter = list.iterator();
	           while (iter.hasNext()) {
	              Attribute attribute = (Attribute) iter.next();
	              if (attribute.getValue().equals("01"))
	                  attribute.setValue("001");
	           }
	 
	           list = document.selectNodes("//students/student");
	           iter = list.iterator();
	           while (iter.hasNext()) {
	              Element element = (Element) iter.next();
	              Iterator iterator = element.elementIterator("name");
	              while (iterator.hasNext()) {
	                  Element nameElement = (Element) iterator.next();
	                  if (nameElement.getText().equals("sam"))
	                     nameElement.setText("jeff");
	              }
	           }
	 
	           XMLWriter output = new XMLWriter(new FileWriter(new File(
	                  "modified.xml")));
	           output.write(document);
	           output.close();
	       }
	 
	       catch (DocumentException e) {
	           System.out.println(e.getMessage());
	       } catch (IOException e) {
	           System.out.println(e.getMessage());
	       }
	    }
	   public static void main(String[] argv) {
		   xmlCRUDDOM4J dom4jParser = new xmlCRUDDOM4J();
	       dom4jParser.modifyDocument(new File("students-gen.xml"));
	    }
}

修改後得到的XML

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="students.xsl"?><students> 
    <student sn="001" flag="ok">
       <name>jeff</name>
       <age>202</age>
    </student>
    <student sn="001">
       <name>jeff</name>
       <age>202</age>
    </student>
    <student sn="02">
       <name>lin</name>
       <age>20</age>
    </student>
    <s>ss</s>
    <ff att="att1">
      <node1>node1</node1>
      <k>sfsss</k>
    </ff>
    <k>sf</k>
</students>



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