JAVA & XML & JAVASCRIPT & AJAX & CSS

          Web 2.0 技術(shù)儲(chǔ)備............

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            77 隨筆 :: 17 文章 :: 116 評(píng)論 :: 0 Trackbacks
           

          本文主要討論了用dom4j解析XML的基礎(chǔ)問題,包括建立XML文檔,添加、修改、刪除節(jié)點(diǎn),以及格式化(美化)輸出和中文問題。可作為dom4j的入門資料。

          轉(zhuǎn)載自:http://jalorsoft.com/holen/

          作者:陳光(holen@263.net

          時(shí)間:2004-09-11

           

          本文主要討論了用dom4j解析XML的基礎(chǔ)問題,包括建立XML文檔,添加、修改、刪除節(jié)點(diǎn),以及格式化(美化)輸出和中文問題。可作為dom4j的入門資料。

           

          1. 下載與安裝

           

          dom4jsourceforge.net上的一個(gè)開源項(xiàng)目,主要用于對(duì)XML的解析。從20017月發(fā)布第一版以來,已陸續(xù)推出多個(gè)版本,目前最高版本為1.5

          dom4j專門針對(duì)Java開發(fā),使用起來非常簡(jiǎn)單、直觀,在Java界,dom4j正迅速普及。

           

          可以到http://sourceforge.net/projects/dom4j下載其最新版。

           

          dom4j1.5的完整版大約13M,是一個(gè)名為dom4j-1.5.zip的壓縮包,解壓后有一個(gè)dom4j-1.5.jar文件,這就是應(yīng)用時(shí)需要引入的類包,另外還有一個(gè)jaxen-1.1-beta-4.jar文件,一般也需要引入,否則執(zhí)行時(shí)可能拋java.lang.NoClassDefFoundError: org/jaxen/JaxenException異常,其他的包可以選擇用之。

           

          2. 示例XML文檔(holen.xml

           

          為了述說方便,先看一個(gè)XML文檔,之后的操作均以此文檔為基礎(chǔ)。

           

          holen.xml

          <?xml version="1.0" encoding="UTF-8"?>

          <books>

                 <!--This is a test for dom4j, holen, 2004.9.11-->

                 <book show="yes">

                        <title>Dom4j Tutorials</title>

                 </book>

                 <book show="yes">

                        <title>Lucene Studing</title>

                 </book>

                 <book show="no">

                        <title>Lucene in Action</title>

                 </book>

                 <owner>O'Reilly</owner>

          </books>

           

          這是一個(gè)很簡(jiǎn)單的XML文檔,場(chǎng)景是一個(gè)網(wǎng)上書店,有很多書,每本書有兩個(gè)屬性,一個(gè)是書名[title],一個(gè)為是否展示[show],最后還有一項(xiàng)是這些書的擁有者[owner]信息。

           

          3. 建立一個(gè)XML文檔

           

           

              /**

               * 建立一個(gè)XML文檔,文檔名由輸入屬性決定

               * @param filename 需建立的文件名

               * @return 返回操作結(jié)果, 0表失敗, 1表成功

               */

              public int createXMLFile(String filename){

                 /** 返回操作結(jié)果, 0表失敗, 1表成功 */

                 int returnValue = 0;

                 /** 建立document對(duì)象 */

                 Document document = DocumentHelper.createDocument();

                 /** 建立XML文檔的根books */

                 Element booksElement = document.addElement("books");

                 /** 加入一行注釋 */

                 booksElement.addComment("This is a test for dom4j, holen, 2004.9.11");

                 /** 加入第一個(gè)book節(jié)點(diǎn) */

                 Element bookElement = booksElement.addElement("book");

                 /** 加入show屬性內(nèi)容 */

                 bookElement.addAttribute("show","yes");

                 /** 加入title節(jié)點(diǎn) */

                 Element titleElement = bookElement.addElement("title");

                 /** title設(shè)置內(nèi)容 */

                 titleElement.setText("Dom4j Tutorials");

                

                 /** 類似的完成后兩個(gè)book */

                 bookElement = booksElement.addElement("book");

                 bookElement.addAttribute("show","yes");

                 titleElement = bookElement.addElement("title");

                 titleElement.setText("Lucene Studing");

                 bookElement = booksElement.addElement("book");

                 bookElement.addAttribute("show","no");

                 titleElement = bookElement.addElement("title");

                 titleElement.setText("Lucene in Action");

                

                 /** 加入owner節(jié)點(diǎn) */

                 Element ownerElement = booksElement.addElement("owner");

                 ownerElement.setText("O'Reilly");

                

                 try{

                     /** document中的內(nèi)容寫入文件中 */

                     XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)));

                     writer.write(document);

                     writer.close();

                     /** 執(zhí)行成功,需返回1 */

                     returnValue = 1;

                 }catch(Exception ex){

                     ex.printStackTrace();

                 }

                       

                 return returnValue;

              }

           

          說明:

          Document document = DocumentHelper.createDocument();

          通過這句定義一個(gè)XML文檔對(duì)象。

           

          Element booksElement = document.addElement("books");

          通過這句定義一個(gè)XML元素,這里添加的是根節(jié)點(diǎn)。

          Element有幾個(gè)重要的方法:

          l         addComment:添加注釋

          l         addAttribute:添加屬性

          l         addElement:添加子元素

           

          最后通過XMLWriter生成物理文件,默認(rèn)生成的XML文件排版格式比較亂,可以通過OutputFormat類的createCompactFormat()方法或createPrettyPrint()方法格式化輸出,默認(rèn)采用createCompactFormat()方法,顯示比較緊湊,這點(diǎn)將在后面詳細(xì)談到。

           

          生成后的holen.xml文件內(nèi)容如下:

           

           

          <?xml version="1.0" encoding="UTF-8"?>

          <books><!--This is a test for dom4j, holen, 2004.9.11--><book show="yes"><title>Dom4j Tutorials</title></book><book show="yes"><title>Lucene Studing</title></book><book show="no"><title>Lucene in Action</title></book><owner>O'Reilly</owner></books>

           

          4. 修改XML文檔

           

          有三項(xiàng)修改任務(wù),依次為:

          l         如果book節(jié)點(diǎn)中show屬性的內(nèi)容為yes,則修改成no

          l         owner項(xiàng)內(nèi)容改為Tshinghua,并添加date節(jié)點(diǎn)

          l         title內(nèi)容為Dom4j Tutorials,則刪除該節(jié)點(diǎn)

           

           

              /**

               * 修改XML文件中內(nèi)容,并另存為一個(gè)新文件

               * 重點(diǎn)掌握dom4j中如何添加節(jié)點(diǎn),修改節(jié)點(diǎn),刪除節(jié)點(diǎn)

               * @param filename 修改對(duì)象文件

               * @param newfilename 修改后另存為該文件

               * @return 返回操作結(jié)果, 0表失敗, 1表成功

               */

              public int ModiXMLFile(String filename,String newfilename){

                 int returnValue = 0;

                 try{

                     SAXReader saxReader = new SAXReader();

                     Document document = saxReader.read(new File(filename));

                     /** 修改內(nèi)容之一: 如果book節(jié)點(diǎn)中show屬性的內(nèi)容為yes,則修改成no */

                     /** 先用xpath查找對(duì)象 */

                     List list = document.selectNodes("/books/book/@show" );

                     Iterator iter = list.iterator();

                     while(iter.hasNext()){

                        Attribute attribute = (Attribute)iter.next();

                        if(attribute.getValue().equals("yes")){

                            attribute.setValue("no");

                        }  

                     }

                    

                     /**

                      * 修改內(nèi)容之二: owner項(xiàng)內(nèi)容改為Tshinghua

                      * 并在owner節(jié)點(diǎn)中加入date節(jié)點(diǎn),date節(jié)點(diǎn)的內(nèi)容為2004-09-11,還為date節(jié)點(diǎn)添加一個(gè)屬性type

                      */

                     list = document.selectNodes("/books/owner" );

                     iter = list.iterator();

                     if(iter.hasNext()){

                        Element ownerElement = (Element)iter.next();

                        ownerElement.setText("Tshinghua");

                        Element dateElement = ownerElement.addElement("date");

                        dateElement.setText("2004-09-11");

                        dateElement.addAttribute("type","Gregorian calendar");

                     }

                    

                     /** 修改內(nèi)容之三: title內(nèi)容為Dom4j Tutorials,則刪除該節(jié)點(diǎn) */

                     list = document.selectNodes("/books/book");

                     iter = list.iterator();

                     while(iter.hasNext()){

                        Element bookElement = (Element)iter.next();

                        Iterator iterator = bookElement.elementIterator("title");

                         while(iterator.hasNext()){

                            Element titleElement=(Element)iterator.next();

                            if(titleElement.getText().equals("Dom4j Tutorials")){

                               bookElement.remove(titleElement);

                            }

                        }

                     }         

                    

                     try{

                        /** document中的內(nèi)容寫入文件中 */

                        XMLWriter writer = new XMLWriter(new FileWriter(new File(newfilename)));

                        writer.write(document);

                        writer.close();

                        /** 執(zhí)行成功,需返回1 */

                        returnValue = 1;

                     }catch(Exception ex){

                        ex.printStackTrace();

                     }

                    

                 }catch(Exception ex){

                     ex.printStackTrace();

                 }

                 return returnValue;

              }

             

           

          說明:

          List list = document.selectNodes("/books/book/@show" );

          list = document.selectNodes("/books/book");

          上述代碼通過xpath查找到相應(yīng)內(nèi)容。

           

          通過setValue()setText()修改節(jié)點(diǎn)內(nèi)容。

           

          通過remove()刪除節(jié)點(diǎn)或?qū)傩浴?/SPAN>

           

          5. 格式化輸出和指定編碼

           

          默認(rèn)的輸出方式為緊湊方式,默認(rèn)編碼為UTF-8,但對(duì)于我們的應(yīng)用而言,一般都要用到中文,并且希望顯示時(shí)按自動(dòng)縮進(jìn)的方式的顯示,這就需用到OutputFormat類。

           

           

             

              /**

               * 格式化XML文檔,并解決中文問題

               * @param filename

               * @return

               */

              public int formatXMLFile(String filename){

                 int returnValue = 0;

                 try{

                     SAXReader saxReader = new SAXReader();

                     Document document = saxReader.read(new File(filename));

                     XMLWriter writer = null;

                     /** 格式化輸出,類型IE瀏覽一樣 */

                     OutputFormat format = OutputFormat.createPrettyPrint();

                     /** 指定XML編碼 */

                     format.setEncoding("GBK");

                     writer= new XMLWriter(new FileWriter(new File(filename)),format);

                     writer.write(document);

                     writer.close();     

                     /** 執(zhí)行成功,需返回1 */

                     returnValue = 1;    

                 }catch(Exception ex){

                     ex.printStackTrace();

                 }

                 return returnValue;

              }

           

          說明:

           

          OutputFormat format = OutputFormat.createPrettyPrint();

          這句指定了格式化的方式為縮進(jìn)式,則非緊湊式。

           

          format.setEncoding("GBK");

          指定編碼為GBK

           

          XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)),format);

          這與前面兩個(gè)方法相比,多加了一個(gè)OutputFormat對(duì)象,用于指定顯示和編碼方式。

           

          6. 完整的類代碼

           

          前面提出的方法都是零散的,下面給出完整類代碼。

           

          Dom4jDemo.java

          package com.holen.dom4j;

           

          import java.io.File;

          import java.io.FileWriter;

          import java.util.Iterator;

          import java.util.List;

           

          import org.dom4j.Attribute;

          import org.dom4j.Document;

          import org.dom4j.DocumentHelper;

          import org.dom4j.Element;

          import org.dom4j.io.OutputFormat;

          import org.dom4j.io.SAXReader;

          import org.dom4j.io.XMLWriter;

           

          /**

           * @author Holen Chen

           */

          public class Dom4jDemo {

             

              public Dom4jDemo() {

              }

           

              public int createXMLFile(String filename){…}

              public int ModiXMLFile(String filename,String newfilename){…}

              public int formatXMLFile(String filename){…}

           

              public static void main(String[] args) {

                 Dom4jDemo temp = new Dom4jDemo();

                 System.out.println(temp.createXMLFile("d://holen.xml"));        System.out.println(temp.ModiXMLFile("d://holen.xml","d://holen2.xml"));

                 System.out.println(temp.formatXMLFile("d://holen2.xml"));

              }

          }

           

          說明:

          main()方法中依次調(diào)用三個(gè)方法,第一個(gè)方法用于生成holen.xml,第二個(gè)方法用于修改holen.xml,并且修改后的內(nèi)容另存為holen2.xml,第三個(gè)方法將holen2.xml格式化縮進(jìn)式輸出,并指定編碼方式為GBK

           

          重新格式化后holen2.xml文件顯示如下:

           

          項(xiàng)目視圖供參考:

           

          7. 總結(jié)

           

          總的來說,dom4j的使用是很簡(jiǎn)單的,而且與Java結(jié)合緊密,功能強(qiáng)大。

          posted on 2006-03-16 16:25 Web 2.0 技術(shù)資源 閱讀(1632) 評(píng)論(2)  編輯  收藏 所屬分類: XML

          評(píng)論

          # re: DOM4J 使用基礎(chǔ)指南........ 2006-10-22 01:05 山風(fēng)小子
          您寫的很好,辛苦了!  回復(fù)  更多評(píng)論
            

          # re: DOM4J 使用基礎(chǔ)指南........ 2006-12-05 21:10 pipi
          學(xué)習(xí)斑竹精神!~
          學(xué)了很多!~  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 绍兴市| 土默特右旗| 咸宁市| 体育| 枞阳县| 阿克陶县| 新疆| 黄骅市| 凤冈县| 中卫市| 南澳县| 新邵县| 大荔县| 清苑县| 饶河县| 新郑市| 兴业县| 安化县| 晋宁县| 息烽县| 巫溪县| 横山县| 通海县| 庆云县| 五大连池市| 兴化市| 岳普湖县| 两当县| 邵阳县| 托克托县| 宽城| 永嘉县| 永寿县| 黑山县| 江津市| 博乐市| 嵊泗县| 武穴市| 息烽县| 水富县| 花莲县|