亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

使用Dom4j操作XML

系統 1815 0

Dom4j也可以很方便完成XML文檔的創建、元素的修改、文檔的查詢遍歷等,但dom4j稍比jdom復雜一點,不過在大片文檔的情況下dom4j的性能要不jdom好。

# 準備

首先,提供相關的jar包

Dom4j jar包下載:

http://sourceforge.net/projects/dom4j/files/dom4j-2.0.0-ALPHA-2/

jaxen jar下載:

http://repo1.maven.org/maven2/jaxen/jaxen/1.1.1/jaxen-1.1.1.jar

和dom4j依賴或相關的jar:

http://dom4j.sourceforge.net/dependencies.html

Junit-jar下載:

http://ebr.springsource.com/repository/app/bundle/version/download?name=com.springsource.org.junit&version=4.8.1&type=binary

?

其次,準備測試案例的部分代碼:

        
          package
        
         com.hoo.test;
      
        ?
      
        
          import
        
         java.io.File;
      
        
          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.Node;
      
        
          import
        
         org.dom4j.QName;
      
        
          import
        
         org.dom4j.dom.DOMAttribute;
      
        
          import
        
         org.dom4j.io.SAXReader;
      
        
          import
        
         org.dom4j.tree.BaseElement;
      
        
          import
        
         org.junit.After;
      
        
          import
        
         org.junit.Before;
      
        
          import
        
         org.junit.Test;
      
        ?
      
        
          /**
        
      
        
           * <b>function:</b> 使用Dom4j操作XML
        
      
        
           * @author hoojo
        
      
        
           * @createDate 2011-8-5 下午06:15:40
        
      
        
           * @file DocumentTest.java
        
      
        
           * @package com.hoo.test
        
      
        
           * @project Dom4jTest
        
      
        
           * @blog http://blog.csdn.net/IBM_hoojo
        
      
        
           * @email hoojo_@126.com
        
      
        
           * @version 1.0
        
      
        
           */
        
      
        
          public
        
        
          class
        
         DocumentTest {
      
      
        
          private
        
         SAXReader reader = null;
      
      
            @Before
      
        
          public
        
        
          void
        
         init() {
      
                reader = 
        
          new
        
         SAXReader();
      
            }
      
      
            @After
      
        
          public
        
        
          void
        
         destory() {
      
                reader = null;
      
                System.gc();
      
            }
      
      
        
          public
        
        
          void
        
         fail(Object o) {
      
        
          if
        
         (o != null)
      
                    System.out.println(o);
      
            }
      
        }
      

?

# 創建一篇 XML 文檔

文檔格式如下:

        
          <?
        
        
          xml
        
        
          version
        
        
          ="1.0"
        
        
          encoding
        
        
          ="UTF-8"
        
        ?
        
          >
        
      
        
          <
        
        
          catalog
        
        
          >
        
      
        
          <!--An XML Catalog-->
        
      
        
          <?
        
        
          target
        
        
          instruction
        
        ?
        
          >
        
      
        
          <
        
        
          journal
        
        
          title
        
        
          ="XML Zone"
        
        
          publisher
        
        
          ="IBM developerWorks"
        
        
          >
        
      
        
          <
        
        
          article
        
        
          level
        
        
          ="Intermediate"
        
        
          date
        
        
          ="December-2001"
        
        
          >
        
      
        
          <
        
        
          title
        
        
          >
        
        Java configuration with XML Schema
        
          </
        
        
          title
        
        
          >
        
      
        
          <
        
        
          author
        
        
          >
        
      
        
          <
        
        
          firstname
        
        
          >
        
        Marcello
        
          </
        
        
          firstname
        
        
          >
        
      
        
          <
        
        
          lastname
        
        
          >
        
        Vitaletti
        
          </
        
        
          lastname
        
        
          >
        
      
        
          </
        
        
          author
        
        
          >
        
      
        
          </
        
        
          article
        
        
          >
        
      
        
          </
        
        
          journal
        
        
          >
        
      
        
          </
        
        
          catalog
        
        
          >
        
      

?

創建文檔代碼如下:

        
          /**
        
      
        
           * <b>function:</b>創建文檔
        
      
        
           * @author hoojo
        
      
        
           * @createDate 2011-8-5 下午06:18:18
        
      
        
           */
        
      
        @Test
      
        
          public
        
        
          void
        
         createDocument() {
      
        
          //創建一篇文檔
        
      
            Document doc = DocumentHelper.createDocument();
      
      
        
          //添加一個元素
        
      
            Element root = doc.addElement(
        
          "catalog"
        
        );
      
        
          //為root元素添加注釋
        
      
            root.addComment(
        
          "An XML Catalog"
        
        );
      
        
          //添加標記
        
      
            root.addProcessingInstruction(
        
          "target"
        
        , 
        
          "instruction"
        
        );
      
      
        
          //創建元素
        
      
            Element journalEl = 
        
          new
        
         BaseElement(
        
          "journal"
        
        );
      
        
          //添加屬性
        
      
            journalEl.addAttribute(
        
          "title"
        
        , 
        
          "XML Zone"
        
        );
      
            journalEl.addAttribute(
        
          "publisher"
        
        , 
        
          "IBM developerWorks"
        
        );
      
            root.add(journalEl);
      
      
        
          //添加元素
        
      
            Element articleEl = journalEl.addElement(
        
          "article"
        
        );
      
            articleEl.addAttribute(
        
          "level"
        
        , 
        
          "Intermediate"
        
        );
      
            articleEl.addAttribute(
        
          "date"
        
        , 
        
          "December-2001"
        
        );
      
      
            Element titleEl = articleEl.addElement(
        
          "title"
        
        );
      
        
          //設置文本內容
        
      
            titleEl.setText(
        
          "Java configuration with XML Schema"
        
        );
      
        
          //titleEl.addText("Java configuration with XML Schema");
        
      
      
            Element authorEl = articleEl.addElement(
        
          "author"
        
        );
      
            authorEl.addElement(
        
          "firstname"
        
        ).setText(
        
          "Marcello"
        
        );
      
            authorEl.addElement(
        
          "lastname"
        
        ).addText(
        
          "Vitaletti"
        
        );
      
      
        
          //可以使用 addDocType() 方法添加文檔類型說明。 
        
      
            doc.addDocType(
        
          "catalog"
        
        , null,
        
          "file://c:/Dtds/catalog.dtd"
        
        ); 
      
        ?
      
            fail(doc.getRootElement().getName());
      
      
        
          //將xml轉換成文本
        
      
            fail(doc.asXML());
      
      
        
          //寫入到文件
        
      
        
          /*XMLWriter output;
        
      
        
              try {
        
      
        
                  output = new XMLWriter(new FileWriter(new File("file/catalog.xml")));
        
      
        
                  output.write(doc);
        
      
        
                  output.close();
        
      
        
              } catch (IOException e) {
        
      
        
                  e.printStackTrace();
        
      
        
              }*/
        
      
        }
      

* DocumentHelper是一個文檔助手類(工具類),它可以完成文檔、元素、文本、屬性、注釋、CDATA、Namespace、XPath的創建,以及利用XPath完成文檔的遍歷和將文本轉換成Document;

parseText完成將xml字符串轉換成Doc的功能

      Document doc = DocumentHelper.parseText(
      
        "<root></root>"
      
      );
    

createDocument創建一個文檔

      Document doc = DocumentHelper.createDocument();
    

如果帶參數就會創建一個帶有根元素的文檔

?

createElement創建一個元素

      Element el = DocumentHelper.createElement(
      
        "el"
      
      );
    

* Document的addElement方法可以給當前文檔添加一個子元素

      Element root = doc.addElement(
      
        "catalog"
      
      );
    

* addComment方法可以添加一段注釋

      root.addComment(
      
        "An XML Catalog"
      
      );
    

為root元素添加一段注釋

?

* addProcessingInstruction添加一個標記

      root.addProcessingInstruction(
      
        "target"
      
      , 
      
        "instruction"
      
      );
    

為root元素添加一個標記

?

* new BaseElement可以創建一個元素

      Element journalEl = 
      
        new
      
       BaseElement(
      
        "journal"
      
      );
    

?

* addAttribute添加屬性

      journalEl.addAttribute(
      
        "title"
      
      , 
      
        "XML Zone"
      
      );
    

* add添加一個元素

      root.add(journalEl);
    

將journalEl元素添加到root元素中

?

* addElement添加一個元素,并返回當前元素

      Element articleEl = journalEl.addElement(
      
        "article"
      
      );
    

給journalEl元素添加一個子元素article

?

* setText、addText可以設置元素的文本

      authorEl.addElement(
      
        "firstname"
      
      ).setText(
      
        "Marcello"
      
      );
      
authorEl.addElement( "lastname" ).addText( "Vitaletti" );

* addDocType可以設置文檔的DOCTYPE

      doc.addDocType(
      
        "catalog"
      
      , null,file://c:/Dtds/catalog.dtd);
    

* asXML可以將文檔或元素轉換成一段xml字符串

      doc.asXML();
      
root.asXML();

* XMLWriter類可以把文檔寫入到文件中

      output = 
      
        new
      
       XMLWriter(
      
        new
      
       FileWriter(
      
        new
      
       File(
      
        "file/catalog.xml"
      
      )));
      
output.write(doc);
output.close();

?

# 修改 XML 文檔內容

        
          /**
        
      
        
           * <b>function:</b> 修改XML內容
        
      
        
           * @author hoojo
        
      
        
           * @createDate 2011-8-9 下午03:37:04
        
      
        
           */
        
      
        @SuppressWarnings(
        
          "unchecked"
        
        )
      
        @Test
      
        
          public
        
        
          void
        
         modifyDoc() {
      
        
          try
        
         {
      
                Document doc = reader.read(
        
          new
        
         File(
        
          "file/catalog.xml"
        
        ));
      
      
        
          //修改屬性內容
        
      
                List list = doc.selectNodes(
        
          "http://article/@level"
        
        );
      
                Iterator<Attribute> iter = list.iterator();
      
        
          while
        
         (iter.hasNext()) {
      
                    Attribute attr = iter.next();
      
                    fail(attr.getName() + 
        
          "#"
        
         + attr.getValue() + 
        
          "#"
        
         + attr.getText());
      
        
          if
        
         (
        
          "Intermediate"
        
        .equals(attr.getValue())) {
      
        
          //修改屬性值
        
      
                        attr.setValue(
        
          "Introductory"
        
        );
      
                        fail(attr.getName() + 
        
          "#"
        
         + attr.getValue() + 
        
          "#"
        
         + attr.getText());
      
                    }
      
                }
      
      
                list = doc.selectNodes(
        
          "http://article/@date"
        
        );
      
                iter = list.iterator();
      
        
          while
        
         (iter.hasNext()) {
      
                    Attribute attr = iter.next();
      
                    fail(attr.getName() + 
        
          "#"
        
         + attr.getValue() + 
        
          "#"
        
         + attr.getText());
      
        
          if
        
         (
        
          "December-2001"
        
        .equals(attr.getValue())) {
      
        
          //修改屬性值
        
      
                        attr.setValue(
        
          "December-2011"
        
        );
      
                        fail(attr.getName() + 
        
          "#"
        
         + attr.getValue() + 
        
          "#"
        
         + attr.getText());
      
                    }
      
                }
      
      
        
          //修改節點內容
        
      
                list = doc.selectNodes(
        
          "http://article"
        
        );
      
                Iterator<Element> it = list.iterator();
      
        
          while
        
         (it.hasNext()) {
      
                    Element el = it.next();
      
                    fail(el.getName() + 
        
          "#"
        
         + el.getText() + 
        
          "#"
        
         + el.getStringValue());
      
        
          //修改title元素
        
      
                    Iterator<Element> elIter = el.elementIterator(
        
          "title"
        
        );
      
        
          while
        
        (elIter.hasNext()) {
      
                        Element titleEl = elIter.next();
      
                        fail(titleEl.getName() + 
        
          "#"
        
         + titleEl.getText() + 
        
          "#"
        
         + titleEl.getStringValue());
      
        
          if
        
         (
        
          "Java configuration with XML Schema"
        
        .equals(titleEl.getTextTrim())) {
      
        
          //修改元素文本值
        
      
                            titleEl.setText(
        
          "Modify the Java configuration with XML Schema"
        
        );
      
                            fail(titleEl.getName() + 
        
          "#"
        
         + titleEl.getText() + 
        
          "#"
        
         + titleEl.getStringValue());
      
                        }
      
                    }
      
                }
      
      
        
          //修改節點子元素內容
        
      
                list = doc.selectNodes(
        
          "http://article/author"
        
        );
      
                it = list.iterator();
      
        
          while
        
         (it.hasNext()) {
      
                    Element el = it.next();
      
                    fail(el.getName() + 
        
          "#"
        
         + el.getText() + 
        
          "#"
        
         + el.getStringValue());
      
                    List<Element> childs = el.elements();
      
        
          for
        
         (Element e : childs) {
      
                        fail(e.getName() + 
        
          "#"
        
         + e.getText() + 
        
          "#"
        
         + e.getStringValue());
      
        
          if
        
         (
        
          "Marcello"
        
        .equals(e.getTextTrim())) {
      
                            e.setText(
        
          "Ayesha"
        
        );
      
                        } 
        
          else
        
        
          if
        
         (
        
          "Vitaletti"
        
        .equals(e.getTextTrim())) {
      
                            e.setText(
        
          "Malik"
        
        );
      
                        } 
      
                        fail(e.getName() + 
        
          "#"
        
         + e.getText() + 
        
          "#"
        
         + e.getStringValue());
      
                    }
      
                }
      
      
        
          //寫入到文件
        
      
        
          /*XMLWriter output = new XMLWriter(new FileWriter(new File("file/catalog-modified.xml")));
        
      
        
                  output.write(doc);
        
      
        
                  output.close();*/
        
      
            } 
        
          catch
        
         (DocumentException e) {
      
                e.printStackTrace();
      
            } 
        
          catch
        
         (Exception e) {
      
                e.printStackTrace();
      
            }
      
        }
      

* reader.read( new File("file/catalog.xml"));讀取指定xml文件內容到文檔中;

* selectNodes是XPath的查詢方法,完成xml文檔的查詢,傳遞xpath路徑。其使用方法可以參考jdom的xpath的使用方法:

???? http://www.cnblogs.com/hoojo/archive/2011/08/11/2134638.html

* getName獲取元素標簽名稱、getValue、getText獲取值、文本內容;

* elementIterator("title");獲取當前節點下所有的title元素,返回Iterator;

* elements獲取下面所有的子元素,返回的是一個集合List;

?

# 顯示文檔相關信息

        
          private
        
         String format(
        
          int
        
         i) {
      
            String temp = 
        
          ""
        
        ;
      
        
          while
        
         (i > 0) {
      
                temp += 
        
          "--"
        
        ;
      
                i--;
      
            }
      
        
          return
        
         temp;
      
        }
      
        ?
      
        
          /**
        
      
        
           * <b>function:</b>遞歸顯示文檔內容
        
      
        
           * @author hoojo
        
      
        
           * @createDate 2011-8-9 下午03:43:45
        
      
        
           * @param i
        
      
        
           * @param els
        
      
        
           */
        
      
        
          private
        
        
          void
        
         print(
        
          int
        
         i, List<Element> els) {
      
            i++;
      
        
          for
        
         (Element el : els) {
      
                fail(format(i) + 
        
          "##"
        
         + el.getName() + 
        
          "#"
        
         + el.getTextTrim());
      
        
          if
        
         (el.hasContent()) {
      
                    print(i, el.elements());
      
                } 
      
            }
      
        }
      
        ?
      
        
          /**
        
      
        
           * <b>function:</b>顯示文檔相關信息
        
      
        
           * @author hoojo
        
      
        
           * @createDate 2011-8-9 下午03:44:10
        
      
        
           */
        
      
        @Test
      
        
          public
        
        
          void
        
         printInfo() {
      
        
          try
        
         {
      
                Document doc = reader.read(
        
          new
        
         File(
        
          "file/catalog.xml"
        
        ));
      
                fail(
        
          "asXML: "
        
         + doc.asXML());
      
      
                fail(doc.asXPathResult(
        
          new
        
         BaseElement(
        
          "article"
        
        )));
      
                List<Node> list = doc.content();
      
        
          for
        
         (Node node : list) {
      
                    fail(
        
          "Node: "
        
         + node.getName() + 
        
          "#"
        
         + node.getText() + 
        
          "#"
        
         + node.getStringValue());
      
                }
      
      
                fail(
        
          "-----------------------------"
        
        );
      
                print(0, doc.getRootElement().elements());
      
      
                fail(
        
          "getDocType: "
        
         + doc.getDocType());
      
                fail(
        
          "getNodeTypeName: "
        
         + doc.getNodeTypeName());
      
                fail(
        
          "getPath: "
        
         + doc.getRootElement().getPath());
      
                fail(
        
          "getPath: "
        
         + doc.getRootElement().getPath(
        
          new
        
         BaseElement(
        
          "journal"
        
        )));
      
                fail(
        
          "getUniquePath: "
        
         + doc.getRootElement().getUniquePath());
      
                fail(
        
          "getXMLEncoding: "
        
         + doc.getXMLEncoding());
      
                fail(
        
          "hasContent: "
        
         + doc.hasContent());
      
                fail(
        
          "isReadOnly: "
        
         + doc.isReadOnly());
      
                fail(
        
          "nodeCount: "
        
         + doc.nodeCount());
      
                fail(
        
          "supportsParent: "
        
         + doc.supportsParent());
      
            } 
        
          catch
        
         (DocumentException e) {
      
                e.printStackTrace();
      
            }
      
            fail(
        
          "getEncoding: "
        
         + reader.getEncoding());
      
            fail(
        
          "isIgnoreComments: "
        
         + reader.isIgnoreComments());
      
            fail(
        
          "isMergeAdjacentText: "
        
         + reader.isMergeAdjacentText());
      
            fail(
        
          "isStringInternEnabled: "
        
         + reader.isStringInternEnabled());
      
            fail(
        
          "isStripWhitespaceText: "
        
         + reader.isStripWhitespaceText());
      
            fail(
        
          "isValidating: "
        
         + reader.isValidating());
      
        }
      

?

# 刪除文檔內容

        
          /**
        
      
        
           * <b>function:</b> 刪除節點內容
        
      
        
           * @author hoojo
        
      
        
           * @createDate 2011-8-9 下午03:47:44
        
      
        
           */
        
      
        @Test
      
        
          public
        
        
          void
        
         removeNode() {
      
        
          try
        
         {
      
                Document doc = reader.read(
        
          new
        
         File(
        
          "file/catalog-modified.xml"
        
        ));
      
                fail(
        
          "comment: "
        
         + doc.selectSingleNode(
        
          "http://comment()"
        
        ));
      
        
          //刪除注釋
        
      
                doc.getRootElement().remove(doc.selectSingleNode(
        
          "http://comment()"
        
        ));
      
      
                Element node = (Element) doc.selectSingleNode(
        
          "http://article"
        
        );
      
        
          //刪除屬性
        
      
                node.remove(
        
          new
        
         DOMAttribute(QName.get(
        
          "level"
        
        ), 
        
          "Introductory"
        
        ));
      
        
          //刪除元素 節點
        
      
                node.remove(doc.selectSingleNode(
        
          "http://title"
        
        ));
      
      
        
          //只能刪除下一級節點,不能超過一級;(需要在父元素的節點上刪除子元素)
        
      
                Node lastNameNode = node.selectSingleNode(
        
          "http://lastname"
        
        );
      
                lastNameNode.getParent().remove(lastNameNode);
      
      
                fail(
        
          "Text: "
        
         + doc.selectObject(
        
          "http://*[text()='Ayesha']"
        
        ));
      
                Element firstNameEl = (Element)doc.selectObject(
        
          "http://firstname"
        
        );
      
                fail(
        
          "Text: "
        
         + firstNameEl.selectSingleNode(
        
          "text()"
        
        ));
      
      
        
          //刪除text文本
        
      
        
          //firstNameEl.remove(firstNameEl.selectSingleNode("text()"));
        
      
        
          //firstNameEl.remove(doc.selectSingleNode("http://firstname/text()"));
        
      
                firstNameEl.remove(doc.selectSingleNode(
        
          "http://*[text()='Ayesha']/text()"
        
        ));
      
      
        
          //刪除子元素author
        
      
        
          //node.remove(node.selectSingleNode("http://author"));
        
      
      
                fail(doc.asXML());
      
            } 
        
          catch
        
         (Exception e) {
      
                e.printStackTrace();
      
            }
      
        }
      

?

* 刪除注釋

      doc.getRootElement().remove(doc.selectSingleNode(
      
        "http://comment()"
      
      ));
    

刪除root元素下面的注釋

?

* 刪除屬性

      node.remove(
      
        new
      
       DOMAttribute(QName.get(
      
        "level"
      
      ), 
      
        "Introductory"
      
      ));
    

刪除node節點中的名稱為level,其值為Introductory的屬性

?

* 刪除元素

      node.remove(doc.selectSingleNode(
      
        "http://title"
      
      ));
    

刪除node節點下的title元素

?

* 刪除文本

      firstNameEl.remove(firstNameEl.selectSingleNode(
      
        "text()"
      
      ));
      
firstNameEl.remove(doc.selectSingleNode( "http://firstname/text()" ));
firstNameEl.remove(doc.selectSingleNode( "http://*[text()='Ayesha']/text()" ));

刪除firstNameEl的文本內容

使用Dom4j操作XML


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日本aⅴ永久免费网站www | 精品国产免费一区二区三区 | 久久国产欧美 | 波多野结衣精品一区二区三区 | 欧美一区二区视频 | 真人女人一级毛片免费视频观看 | 精品国产一区二区 | 久久大香伊蕉在人线观看热2 | 亚洲欧美日韩第一页 | 亚洲欧洲日产国码二区首页 | 1000部羞羞禁止免费观看视频 | 日韩欧美一区二区三区不卡 | 久久久夜间小视频 | 99热这里只有精品首页精品 | 四虎4hu永久免费视频大全 | 亚洲视频中文字幕在线观看 | 毛片日韩| 亚洲国产成人私人影院 | 亚洲最新视频在线观看 | 色综合久久精品中文字幕 | 国产成人综合亚洲欧洲色就色 | 久久99久久精品国产99热 | 久久久久免费精品视频 | 国产精品小视频在线观看 | 曰本毛片 | 国产福利资源 | 视频一区在线播放 | 五月月色开心婷婷久久合 | 国产一区二区三区播放 | 日韩欧美第一页 | 国产午夜不卡 | 国产综合久久 | 亚洲免费一区二区 | 久久久www成人免费精品 | 国产欧美精品 | 亚洲成人99 | 欧美一级毛片片免费孕妇 | 91精品国产综合久久婷婷 | 天天看片天天爽 | 欧美激情在线视频播放 | 999久久久免费精品国产牛牛 |