java xml操作實例

xml文件操作常用兩種方式:

一是jdom :特點,操作簡單,一般讀取常用,效率不高;
最近的工作常常要和XML格式的文檔或字符串打交道,發現用JDOM來做真是方便。可以實現XML應用程序的快速開發。
   在 JDOM 中,XML 元素就是 Element 的實例,XML 屬性就是 Attribute 的實例,XML 文檔本身就是 Document 的實例。
   因爲 JDOM 對象就是像 Document、Element 和 Attribute 這些類的直接實例,因此創建一個新 JDOM 對象就如在 Java 語言中使用 new 操作符一樣容易。JDOM 的使用是直截了當的。
   JDOM 使用標準的 Java 編碼模式。只要有可能,它使用 Java new 操作符而不故弄玄虛使用複雜的工廠化模式,使對象操作即便對於初學用戶也很方便。
  
   本文分兩步對JDOM的應用加以介紹:XML創建 和 XML解析
  一、XML文檔創建
   我們由零開始利用JDOM生成一個XML文檔。最後的結果(樣本文檔)看起來象這樣:
  
  
  
   1.以 MyInfo 爲根元素創建文檔
   Element rootElement = new Element("MyInfo");//所有的XML元素都是 Element 的實例。根元素也不例外:)
   Document myDocument = new Document(rootElement);//以根元素作爲參數創建Document對象。一個Document只有一個根,即root元素。
   2.給根元素添加屬性
   Attribute rootAttri = new Attribute("comment","introduce myself");//創建名爲 commnet,值爲 introduce myself 的屬性。
   rootElement.setAttribute(rootAttri);//將剛創建的屬性添加到根元素。
   這兩行代碼你也可以合成一行來寫,象這樣:
   rootElement.setAttribute(new Attribute("comment","introduce myself"));
   或者
   rootElement.setAttribute("comment","introduce myself");
   3.添加元素和子元素
   JDOM裏子元素是作爲 content(內容)添加到父元素裏面去的,所謂content就是類似上面樣本文檔中之間的東東,即kingwong。羅嗦了點是吧:)
   Element nameElement = new Element("name");//創建 name 元素
   nameElement.addContent("kingwong");//將kingwong作爲content添加到name元素
   rootElement.addContent(nameElement);//將name元素作爲content添加到根元素
  
   這三行你也可以合爲一句,象這樣:
   rootElement.addContent((Content)(new Element("name").addContent("kingwong")));//因爲addContent(Content child)方法返回的是一個Parent接口,而Element類同時繼承了Content類和實現了Parent接口,所以我們把它造型成Content。
  
   我們用同樣的方法添加帶屬性的子元素
   rootElement.addContent(new Element("sex").setAttribute("value","male"));//注意這裏不需要轉型,因爲addAttribute(String name,String value)返回值就是一個 Element。
  
   同樣的,我們添加元素到根元素下,用法上一樣,只是稍微複雜了一些:
   rootElement.addContent((Content)(new Element("contact").addContent((Content)(new Element("telephone").addContent("87654321")))));
   如果你對這種簡寫形式還不太習慣,你完全可以分步來做,就象本節剛開始的時候一樣。事實上如果層次比較多,寫成分步的形式更清晰些,也不容易出錯。
   4.刪除子元素
   這個操作比較簡單:
   rootElement.removeChild("sex");//該方法返回一個布爾值
  
   到目前爲止,我們學習了一下JDOM文檔生成操作。上面建立了一個樣本文檔,可是我們怎麼知道對不對呢?因此需要輸出來看一下。我們將JDOM生成的文檔輸出到控制檯,使用 JDOM 的 XMLOutputter 類。
   5. 將 JDOM 轉化爲 XML 文本
   XMLOutputter xmlOut = new XMLOutputter(" ",true);
   try {
   xmlOut.output(myDocument,System.out);
   } catch (IOException e) {
   e.printStackTrace();
   }
   XMLOutputter 有幾個格式選項。這裏我們已指定希望子元素從父元素縮進兩個空格,並且希望元素間有空行。
   new XMLOutputter(java.lang.String indent, boolean newlines)這個方法在最新版本中已經不建議使用。JDOM有一個專門的用來定義格式化輸出的類:org.jdom.output.Format,如果你沒有特殊的要求,有時候使用裏面的幾個靜態方法(應該可以說是預定義格式)如 getPrettyFormat()就可以了。我們把上面的輸出格式稍微改一下,就象這樣:
   XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat());
   6.將JDOM文檔轉化爲其他形式
   XMLOutputter 還可輸出到 Writer 或 OutputStream。爲了輸出JDOM文檔到一個文本文件,我們可以這樣做:
   FileWriter writer = new FileWriter("/some/directory/myFile.xml");
   outputter.output(myDocument, writer);
   writer.close();
  
   XMLOutputter 還可輸出到字符串,以便程序後面進行再處理:
   Strng outString = xmlOut.outputString(myDocument);
  
   當然,在輸出的時候你不一定要輸出所有的整個文檔,你可以選擇元素進行輸出:
   xmlOut.output(rootElement.getChild("name"),System.out);
   一句話,JDOM非常靈活方便!如果你想進一步研究JDOM,請到官方網站去看一看:http://www.jdom.org
  
   本節示例源碼:
  package com.cyberobject.study;
  
  import java.io.IOException;
  
  import org.jdom.Attribute;
  import org.jdom.Content;
  import org.jdom.Document;
  import org.jdom.Element;
  import org.jdom.output.Format;
  import org.jdom.output.XMLOutputter;
  
  /**
   * @author kingwong
   *
   * TODO To change the template for this generated type comment go to
   * Window - Preferences - Java - Code Style - Code Templates
   */
  public class TestJDOM {
  
   public static void main(String[] args)
   {
   Element rootElement = new Element("MyInfo");
   Document myDocument = new Document(rootElement);
  
  // Attribute rootAttri = new Attribute("comment","introduce myself");
  // rootElement.setAttribute(rootAttri);
  
   rootElement.setAttribute("comment","introduce myself");
   //rootElement.setAttribute(new Attribute("comment","introduce myself"));
  // Element sexElement = new Element("sex");
  // rootElement.addContent(sexElement);
  
  // Element nameElement = new Element("name");
  // nameElement.addContent("kingwong");
  // rootElement.addContent(nameElement);
  
   rootElement.addContent((Content)(new Element("name").addContent("kingwong")));
   rootElement.addContent(new Element("sex").setAttribute("value","male"));
   rootElement.addContent((Content)(new Element("contract").addContent((Content)(new Element("telephone").addContent("87654321")))));
  
   rootElement.removeChild("sex");
  
   XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat());
   try {
   xmlOut.output(myDocument,System.out);
   //xmlOut.output(rootElement.getChild("name"),System.out);
   //String outString = xmlOut.outputString(myDocument);
   } catch (IOException e) {
   e.printStackTrace();
   }
   }
  }
  
  
  二、XML文檔解析
   JDOM 不光可以很方便的建立XML文檔,它的另一個用處是它能夠讀取並操作現有的 XML 數據。
   JDOM的解析器在org.jdom.input.*這個包裏,其中的DOMBuilder的功能是將DOM模型的Document解析成JDOM模型的Document;SAXBuilder的功能是從文件或流中解析出符合JDOM模型的XML樹。由於我們經常要從一個文件裏讀取數據,因此我們應該採用後者作爲解析工具。
  解析一個xml文檔,基本可以看成以下幾個步驟:
   1.實例化一個合適的解析器對象
   本例中我們使用SAXBuilder:
   SAXBuilder sb = new SAXBuilder();
   2.以包含XML數據的文件爲參數,構建一個文檔對象myDocument
   Document myDocument = sb.build(/some/directory/myFile.xml);
   3.獲到根元素
   Element rootElement = myDocument.getRootElement();
  
   一旦你獲取了根元素,你就可以很方便地對它下面的子元素進行操作了,下面對Element對象的一些常用方法作一下簡單說明:
   getChild("childname") 返回指定名字的子節點,如果同一級有多個同名子節點,則只返回第一個;如果沒有返回null值。
   getChildren("childname") 返回指定名字的子節點List集合。這樣你就可以遍歷所有的同一級同名子節點。
   getAttributeValue("name") 返回指定屬性名字的值。如果沒有該屬性則返回null,有該屬性但是值爲空,則返回空字符串。
   getChildText("childname") 返回指定子節點的內容文本值。
   getText() 返回該元素的內容文本值。
  
   還有其他沒有羅列出來的方法,如果需要的話,可以隨時查閱JDOM的在線文檔:http://www.jdom.org/docs/apidocs/index.html。當然你可以在你需要的地方添加、刪除元素操作,還記得上面的創建XML的方法嗎?呵呵~~~
  
   學習新東東還是從實例學起最爲快捷,下面簡單舉個例子,就以上面的XML樣本代碼來學習JDOM的XML解析。本例中讀取了樣本XML文件裏一些屬性和content,最後我們還在contact元素裏插入了一個新元素。儘管我們實現了對於XML的基本操作,細心的朋友可能會
  有疑問:如果XML文檔的層次稍微複雜一些,如果嵌套多達幾十上百層的話(開個玩笑),如果靠這樣從根元素一級一級地通過getChild("childname")來訪問子元素的話,將會非常痛苦!是的,的確是這樣,但是我們有另一個有力的工具XPath,爲什麼不用呢?這是後話!先賣個關子(手敲累啦,下回吧,呵呵)。
  
  /*
   * Created on 2004-8-21
   *
   * TODO To change the template for this generated file go to
   * Window - Preferences - Java - Code Style - Code Templates
   */
  package com.cyberobject.study;
  
  import org.jdom.Document;
  import org.jdom.Element;
  import org.jdom.input.SAXBuilder;
  import org.jdom.output.Format;
  import org.jdom.output.XMLOutputter;
  
  /**
   * @author kingwong
   *
   * TODO To change the template for this generated type comment go to
   * Window - Preferences - Java - Code Style - Code Templates
   */
  public class TestJDOM2 {
   public static void main(String[] args){
   SAXBuilder sb = new SAXBuilder();
   try
   {
   Document doc = sb.build("myFile.xml");
   Element root = doc.getRootElement();
  
   String str1 = root.getAttributeValue("comment");
   System.out.println("Root Element's comment attribute is : " + str1);
   String str2 = root.getChild("sex").getAttributeValue("value");
   System.out.println("sex Element's value attribute is : " + str2);
   String str3 = root.getChildText("name");
   System.out.println("name Element's content is :" + str3);
   String str4 = root.getChild("contact").getChildText("telephone");
   System.out.println("contact Element's telephone subelement content is : " + str4 + "\n");
   Element inputElement = root.getChild("contact");
   inputElement.addContent(new Element("email").setAttribute("value","[email protected]"));
  
   XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat());
   String outStr = xmlOut.outputString(root);
   System.out.println(outStr);
   }
   catch(Exception e)
   {
   e.printStackTrace();
   }
  }
  }   評論這張
 轉發至微博
 轉發至微博


二是dom4j 特點,操作稍微複雜,讀取效率較高,對大批量讀取使用;

dom4j解析XML  2010-10-12 14:29:59|  分類: XML |  標籤: |字號大中小 訂閱 .

dom4j 是一種解析 XML 文檔的開放源代碼 XML 框架,與 W3C DOM API 相比,使用 dom4j 所包含的解析器的好處是 dom4j 擁有本地的 XPath 支持.DOM 解析器不支持使用 XPath 選擇節點.

  該解析器可以從 http://dom4j.org/ 獲取.


java 代碼
java 代碼
package com.nikee.dom4j;        
import org.dom4j.Document;        
import org.dom4j.DocumentHelper;        
import org.dom4j.Element;        
import org.dom4j.io.OutputFormat;        
import org.dom4j.io.XMLWriter;        
import java.io.*;        
         
public class XmlDom4J{        
 public void generateDocument(){        
  //使用 DocumentHelper 類創建一個文檔實例。 DocumentHelper 是生成 XML 文檔節點的 dom4j API 工廠類        
  Document document = DocumentHelper.createDocument();        
          
  //使用 addElement()方法創建根元素catalog , addElement()用於向 XML 文檔中增加元素        
  Element catalogElement = document.addElement("catalog");        
          
  //在 catalog 元素中使用 addComment() 方法添加註釋"An XML catalog"        
  catalogElement.addComment("An XML Catalog");        
          
  //在 catalog 元素中使用 addProcessingInstruction() 方法增加一個處理指令        
  catalogElement.addProcessingInstruction("target","text");        
          
  //在 catalog 元素中使用 addElement() 方法增加 journal 元素        
  Element journalElement = catalogElement.addElement("journal");        
  //使用 addAttribute() 方法向 journal 元素添加 title 和 publisher 屬性        
  journalElement.addAttribute("title", "XML Zone");        
  journalElement.addAttribute("publisher", "IBM developerWorks");        
          
          
  Element articleElement=journalElement.addElement("article");        
  articleElement.addAttribute("level", "Intermediate");        
  articleElement.addAttribute("date", "December-2001");        
          
  Element titleElement=articleElement.addElement("title");        
  titleElement.setText("Java configuration with XML Schema");        
          
  Element authorElement=articleElement.addElement("author");        
  Element firstNameElement=authorElement.addElement("firstname");        
  firstNameElement.setText("Marcello");        
  Element lastNameElement=authorElement.addElement("lastname");        
  lastNameElement.setText("Vitaletti");        
          
  //可以使用 addDocType() 方法添加文檔類型說明        
  //這樣就向 XML 文檔中增加文檔類型說明:        
  document.addDocType("catalog","nikee","file://c:/Dtds/catalog.dtd");        
  try{        
   //XMLWriter output = new XMLWriter(new FileWriter( new File("D:/eclipse3.2/workspace/WebServices/src/com/nikee/dom4j/catalog.xml")));        
    FileOutputStream fos=new FileOutputStream("D:/eclipse3.2/workspace/WebServices/src/com/nikee/dom4j/catalog.xml");        
       OutputFormat of=new OutputFormat("    ", true);        
       XMLWriter xw=new XMLWriter(fos, of);        
       xw.write( document );        
       xw.close();        
  }        
  catch(IOException e)        
  {        
   System.out.println(e.getMessage());        
  }        
 }        
         
 public static void main(String[] argv){        
  XmlDom4J dom4j=new XmlDom4J();        
  dom4j.generateDocument();        
 }        
}        


xml 代碼


xml 代碼


<!--sp-->xml version="1.0" encoding="UTF-8"?>       
<!--CTYPE catalog PUBLIC "nikee" "file://c:/Dtds/catalog.dtd"</sp-->>       
       
 <catalog>       
    <!--An XML Catalog--><!--sp-->target text?>       
       
    <journal title="XML Zone" publisher="IBM developerWorks">       
     <article level="Intermediate" date="December-2001">       
         <title>Java configuration with XML Schematitle>       
         <author>       
             <firstname>Marcellofirstname>       
             <lastname>Vitalettilastname>       
         author>       
     article>       
    journal>       
 catalog>   


XmlDom4J.java 用於創建 XML 文檔 catalog.xml


java 代碼
java 代碼
package com.nikee.dom4j;        
       
import org.dom4j.Document;        
import org.dom4j.Element;        
import org.dom4j.Attribute;        
import java.util.List;        
import java.util.Iterator;        
       
import org.dom4j.io.OutputFormat;        
import org.dom4j.io.XMLWriter;        
import java.io.*;        
       
import org.dom4j.DocumentException;        
import org.dom4j.io.SAXReader;         
         
public class Dom4Jparser{        
    public Dom4Jparser(){        
        //construction        
    }        
            
    public void modifyDocument(File inputXml){        
        try{        
            //使用 SAXReader 解析 XML 文檔 catalog.xml        
            SAXReader saxReader = new SAXReader();        
            Document document = saxReader.read(inputXml);        
                    
            //使用 XPath 表達式從 article 元素中獲得 level 節點列表。如果 level 屬性值是"Intermediate"則改爲"Introductory"        
            List list = document.selectNodes("//article/@level");        
            Iterator iter=list.iterator();        
            while(iter.hasNext()){        
                Attribute attribute=(Attribute)iter.next();        
                if(attribute.getValue().equals("Intermediate"))        
                    attribute.setValue("Introductory");         
            }        
                    
            list = document.selectNodes("//article/@date" );        
            iter=list.iterator();        
            while(iter.hasNext()){        
                Attribute attribute=(Attribute)iter.next();        
                if(attribute.getValue().equals("December-2001"))        
                    attribute.setValue("October-2002");        
            }        
                    
            //獲取 article 元素列表,從 article 元素中的 title 元素得到一個迭代器,並修改 title 元素的文本        
            list = document.selectNodes("//article" );        
            iter=list.iterator();        
            while(iter.hasNext()){        
                Element element=(Element)iter.next();        
                Iterator iterator=element.elementIterator("title");        
                while(iterator.hasNext()){        
                    Element titleElement=(Element)iterator.next();        
                    if(titleElement.getText().equals("Java configuration with XML Schema"))        
                        titleElement.setText("Create flexible and extensible XML schema");        
                }        
            }        
                    
                    
            list = document.selectNodes("//article/author" );        
            iter=list.iterator();        
            while(iter.hasNext()){        
                Element element=(Element)iter.next();        
                Iterator iterator=element.elementIterator("firstname");        
                while(iterator.hasNext()){        
                    Element firstNameElement=(Element)iterator.next();        
                    if(firstNameElement.getText().equals("Marcello"))        
                        firstNameElement.setText("Ayesha");        
                }        
            }        
                    
            list = document.selectNodes("//article/author" );        
            iter=list.iterator();        
            while(iter.hasNext()){        
                Element element=(Element)iter.next();        
                Iterator iterator=element.elementIterator("lastname");        
                while(iterator.hasNext()){        
                    Element lastNameElement=(Element)iterator.next();        
                    if(lastNameElement.getText().equals("Vitaletti"))        
                        lastNameElement.setText("Malik");        
                }        
            }        
                    
            FileOutputStream fos=new FileOutputStream("D:/eclipse3.2/workspace/WebServices/src/com/nikee/dom4j/catalog-modified.xml");        
            OutputFormat of=new OutputFormat("   ",true);        
            XMLWriter xw=new XMLWriter(fos, of);        
            xw.write( document );        
            xw.close();        
        }        
        catch(DocumentException e)        
        {        
            e.printStackTrace();        
        }        
        catch(IOException e){        
            e.printStackTrace();        
        }        
    }        
            
    public static void main(String argv[]){        
        Dom4Jparser dom4jParser=new Dom4Jparser();        
        dom4jParser.modifyDocument(new File("D:/eclipse3.2/workspace/WebServices/src/com/nikee/dom4j/catalog.xml"));        
    }        
}        
xml 代碼
xml 代碼
<!--sp-->xml version="1.0" encoding="UTF-8"?>       
       
<!--<!DOCTYPE catalog PUBLIC "nikee" "file://c:/Dtds/catalog.dtd">-->       
<catalog>       
<!--An XML Catalog--><!--sp-->target text?>       
 <journal title="XML Zone" publisher="IBM developerWorks">         
   <article level="Introductory" date="October-2002">           
      <title>Create flexible and extensible XML schematitle>       
      <author>            
         <firstname>Ayeshafirstname>       
         <lastname>Maliklastname>       
      author>       
   article>       
 journal>       
catalog>     
Dom4Jparser.java用於修改 XML 文檔 catalog.xml爲catalog-modified.xml
問題總結:

1.當catalog.xml有<!--CTYPE catalog PUBLIC "nikee" "file://c:/Dtds/catalog.dt-->這一句,Dom4Jparser.java修改 XML 文檔 catalog.xml爲catalog-modified.xml時,發生異常org.dom4j.DocumentException: c Nested exception: c.

原因:我自己沒有此file://c:/Dtds/catalog.dtd.

解決辦法:刪掉此行.

2.除了加入dom4j.jar包外,必須加入jaxen.jar包,否則會發生異常.jaxen包可在http://jaxen.org/下載.



發佈了23 篇原創文章 · 獲贊 8 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章