DOM4j使用教程


DOM4j是一個易用的,開源的JAVA操作XML的API,寫過一篇4種XML操作API的比較,DOM4j是性能和易用行最佳的。因此做一個小教程,供初學者學習。

         學習DOM4j首先就先來了解下它主要的包

                DOM4j所有的接口都在org.dom4j這個包裏定義着

               org.dom4j.Attribute : Attribute接口定義了XML文件的屬性

               org.dom4j.Branch : Branch爲能夠包含子節點的節點如XML元素和文檔定義了一個公共行爲

                org.dom4j.CDATA : CDATA定義了XML CDATA區域

                org.dom4j.CharacterData: CharacterData是一個標識接口,標識基於字符的節點。

               org.dom4j.Comment : Comment定義了XML註釋的行爲

                org.dom4j.Document : Docement接口定義了XML文檔

               org.dom4j.Element   : Element定義了XML元素

               org.dom4j.ElementHandler: ElementHandler定義了Element對象的處理器

               org.dom4j.ElementPath : 被ElementHandler使用,用於取得當前正在處理的路徑層次信息

                org.dom4j.Entity     : Entity定義XML entity

                org.dom4j.Node :   Node爲所有的dom4j中XML節點定義了多態行爲

               org.dom4j.NodeFilter : NodeFilter定義了在dom4j節點中產生的一個濾鏡或謂詞的行爲

                org.dom4j.ProcessingInstruction : ProcessingInstruction定義XML處理指令

                org.dom4j.Text   : Test定義了XML文本節點

               org.dom4j.Visitor : Visitor用於實現Visitor模式

               org.dom4j.XPath : XPath在分析一個字符串後會提供一個XPath表達式

          下面說下主要的實用方法

          1: 讀取並解析XML文檔:

                讀寫XML文檔主要依賴於org.dom4j.io包,提供了DOMReader和SAXReader兩類不同方式,調用方式一樣。

            // 從文件讀取XML,輸入文件名,返回XML文檔
    public Document read(String fileName) throws MalformedURLException, DocumentException {
     
                SAXReader reader = new SAXReader();
             Document document = reader.read(new File(fileName));
             return document;
      }
   2:取得ROOT節點
         如果要讀取一個XML文件,最重要的就是要讀取ROOT節點了,一切分析XML都是從ROOT節點開始。
    
   public Element getRootElement(Document doc){
             return doc.getRootElement();
    }
   3:遍歷XML樹,這裏有二種方法
      (1): 枚舉
           // 枚舉所有子節點
    for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
       Element element = (Element) i.next();
       // do something
    }
    // 枚舉名稱爲foo的節點
    for ( Iterator i = root.elementIterator(foo); i.hasNext();) {
       Element foo = (Element) i.next();
       // do something
    }
    // 枚舉屬性
    for ( Iterator i = root.attributeIterator(); i.hasNext(); ) {
       Attribute attribute = (Attribute) i.next();
       // do something
    }
(2) : 遞歸
     public void treeWalk() {
       treeWalk(getRootElement());
    }
    public void treeWalk(Element element) {
       for (int i = 0, size = element.nodeCount(); i < size; i++)     {
           Node node = element.node(i);
           if (node instanceof Element) {
              treeWalk((Element) node);
           } else { // do something....
           }
       }
}
4:字符串與XML的轉換
   // XML轉字符串
  Document document = ...;
    String text = document.asXML();
// 字符串轉XML
    String text = <person> <name>James</name> </person>;
    Document document = DocumentHelper.parseText(text);
5. 創建XML
     這裏創建一個XML,沒有寫
    public Document createDocument() {
       Document document = DocumentHelper.createDocument();
       Element root = document.addElement(root);
       Element author1 =
           root
              .addElement(author)
              .addAttribute(name, James)
              .addAttribute(location, UK)
              .addText(James Strachan);
       Element author2 =
           root
              .addElement(author)
              .addAttribute(name, Bob)
              .addAttribute(location, US)
              .addText(Bob McWhirter);
       return document;
    }
   6: XML 文件輸出
   FileWriter out = new FileWriter( foo.xml );
    document.write(out);
 
    DOM4j 的簡單常用的方法上面總結了下,大家可以有一個印象,想要學的仔細了就要自己好好研究了,下面有一個以前寫的小程序,實現了創建和編輯XML文件的功能。
    package com.dom4j.test;
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.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class NewXML {
/**
*
* 用DOM4J創建一個XML文件
* @param args
*/

public boolean newXMl(String fileName){
 
   boolean returnValue=false;
 
   //定義一個XML文檔
 
   Document docement=DocumentHelper.createDocument();
 
   //設置XML文檔的元素
   Element rootElement=docement.addElement("DOM4J創建XML文檔");
 
   rootElement.addComment("鏡花水月2007-4-24晚上創建");
 
   Element nameElement=rootElement.addElement("鏡花水月");
 
   nameElement.addAttribute("名字","不告訴你");
 
   Element schoolElement=nameElement.addElement("學校");
 
   schoolElement.setText("西安翻譯學院");
 
   Element cityElement=rootElement.addElement("城市");
 
   cityElement.setText("上海");
 
   Element homeElement=cityElement.addElement("住址");
 
   homeElement.setText("徐家彙");
 
   //創建XML文檔
   try {
  
            /** 格式化輸出,類型IE瀏覽一樣 */
  
    OutputFormat format = OutputFormat.createPrettyPrint();
  
    /** 指定XML編碼 */
  
    format.setEncoding("GBK");
  
    XMLWriter writer=new XMLWriter(new FileWriter(new File(fileName)),format);
           
         writer.write(docement);
        
    writer.close();
  
    return returnValue=true;  
  
  
   } catch (IOException e) {
  
    e.printStackTrace();
   }
 
 
 
   return returnValue;
 
}

/**
*
* 用DOM4J修改一個XML文件
* @param args
*
*/

public boolean update(String fileName,String newFileName){
 
   boolean returnValaue=false;
 
 
 
   SAXReader reader=new SAXReader();
 
   try {
    Document docement=reader.read(new File(fileName));
  
    List list=null;
  
    list=docement.selectNodes("/DOM4J創建XML文檔/鏡花水月/@名字");
  
    Iterator it=list.iterator();
  
    while(it.hasNext()){
     Attribute attribute=(Attribute) it.next();
     if(attribute.getValue().equals("不告訴你")){
      attribute.setValue("還是不告訴你");
     }
    }
  
    //將就該寫入新的文件
  
    try {
     //轉碼
     OutputFormat format=OutputFormat.createPrettyPrint();
   
     format.setEncoding("GBK");
   
     XMLWriter writer=new XMLWriter(new FileWriter(new File(newFileName)),format);
   
     writer.write(docement);
   
     writer.close();
   
     return returnValaue=true;
   
    } catch (IOException e) {
   
     e.printStackTrace();
    }
  
  
   } catch (DocumentException e) {
  
    e.printStackTrace();
   }
 
   return returnValaue;
}
public static void main(String[] args) {
 
   NewXML newXml=new NewXML();
 
   String name="newXML.xml";
 
   String newName="UpdateXML.xml";
 
   if(!newXml.newXMl(name)){
    System.out.println("創建出現錯誤!");
    return ;
   }else{
    System.out.println("創建XML成功!");
   }
 
   if(!newXml.update(name,newName)){
    System.out.println("修改出現錯誤!");
    return;
   }else{
    System.out.println("修改XML成功");
   }
 
}
}

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