Dom4j 操作XML

原文: http://blog.csdn.net/ibm_hoojo/article/details/6679266


 

Dom4j 操作XML


Dom4j也可以很方便完成XML文档的创建、元素的修改、文档的查询遍历等,但dom4j稍比jdom复杂一点,不过在大片文档的情况下dom4j的性能要不jdom好。

 

#  准备

首先,提供相关的jar包

Dom4jjar包下载:

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

jaxenjar下载:

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

 

其次,准备测试案例的部分代码:

[java]  view plain copy print ?
  1. package com.hoo.test;  
  2.   
  3. import java.io.File;  
  4. import java.util.Iterator;  
  5. import java.util.List;  
  6. import org.dom4j.Attribute;  
  7. import org.dom4j.Document;  
  8. import org.dom4j.DocumentException;  
  9. import org.dom4j.DocumentHelper;  
  10. import org.dom4j.Element;  
  11. import org.dom4j.Node;  
  12. import org.dom4j.QName;  
  13. import org.dom4j.dom.DOMAttribute;  
  14. import org.dom4j.io.SAXReader;  
  15. import org.dom4j.tree.BaseElement;  
  16. import org.junit.After;  
  17. import org.junit.Before;  
  18. import org.junit.Test;  
  19.   
  20. /** 
  21.  * <b>function:</b> 使用Dom4j操作XML 
  22.  * @author hoojo 
  23.  * @createDate 2011-8-5 下午06:15:40 
  24.  * @file DocumentTest.java 
  25.  * @package com.hoo.test 
  26.  * @project Dom4jTest 
  27.  * @blog http://blog.csdn.net/IBM_hoojo 
  28.  * @email [email protected] 
  29.  * @version 1.0 
  30.  */  
  31. public class DocumentTest {  
  32.       
  33.     private SAXReader reader = null;  
  34.       
  35.     @Before  
  36.     public void init() {  
  37.         reader = new SAXReader();  
  38.     }  
  39.       
  40.     @After  
  41.     public void destory() {  
  42.         reader = null;  
  43.         System.gc();  
  44.     }  
  45.       
  46.     public void fail(Object o) {  
  47.         if (o != null)  
  48.             System.out.println(o);  
  49.     }  
  50. }  

 

#  创建一篇XML文档

文档格式如下:

[java]  view plain copy print ?
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <catalog>   
  3.     <!--An XML Catalog-->   
  4.     <?target instruction?>  
  5.     <journal title="XML Zone" publisher="IBM developerWorks">   
  6.          <article level="Intermediate" date="December-2001">  
  7.              <title>Java configuration with XML Schema</title>   
  8.              <author>   
  9.                  <firstname>Marcello</firstname>   
  10.                  <lastname>Vitaletti</lastname>   
  11.              </author>  
  12.          </article>  
  13.     </journal>   
  14. </catalog>  

 

创建文档代码如下:

[java]  view plain copy print ?
  1. /** 
  2.  * <b>function:</b>创建文档 
  3.  * @author hoojo 
  4.  * @createDate 2011-8-5 下午06:18:18 
  5.  */  
  6. @Test  
  7. public void createDocument() {  
  8.     //创建一篇文档  
  9.     Document doc = DocumentHelper.createDocument();  
  10.       
  11.     //添加一个元素  
  12.     Element root = doc.addElement("catalog");  
  13.     //为root元素添加注释  
  14.     root.addComment("An XML Catalog");  
  15.     //添加标记  
  16.     root.addProcessingInstruction("target""instruction");  
  17.       
  18.     //创建元素  
  19.     Element journalEl = new BaseElement("journal");  
  20.     //添加属性  
  21.     journalEl.addAttribute("title""XML Zone");  
  22.     journalEl.addAttribute("publisher""IBM developerWorks");  
  23.     root.add(journalEl);  
  24.       
  25.     //添加元素  
  26.     Element articleEl = journalEl.addElement("article");  
  27.     articleEl.addAttribute("level""Intermediate");  
  28.     articleEl.addAttribute("date""December-2001");  
  29.       
  30.     Element titleEl = articleEl.addElement("title");  
  31.     //设置文本内容  
  32.     titleEl.setText("Java configuration with XML Schema");  
  33.     //titleEl.addText("Java configuration with XML Schema");  
  34.       
  35.     Element authorEl = articleEl.addElement("author");  
  36.     authorEl.addElement("firstname").setText("Marcello");  
  37.     authorEl.addElement("lastname").addText("Vitaletti");  
  38.       
  39.     //可以使用 addDocType() 方法添加文档类型说明。   
  40.     doc.addDocType("catalog"null,"file://c:/Dtds/catalog.dtd");   
  41.   
  42.     fail(doc.getRootElement().getName());  
  43.       
  44.     //将xml转换成文本  
  45.     fail(doc.asXML());  
  46.       
  47.     //写入到文件  
  48.     /*XMLWriter output; 
  49.     try { 
  50.         output = new XMLWriter(new FileWriter(new File("file/catalog.xml"))); 
  51.         output.write(doc); 
  52.         output.close(); 
  53.     } catch (IOException e) { 
  54.         e.printStackTrace(); 
  55.     }*/  
  56. }  
*  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元素添加一个标记

 

*  newBaseElement可以创建一个元素

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文档内容

[java]  view plain copy print ?
  1. /** 
  2.  * <b>function:</b> 修改XML内容 
  3.  * @author hoojo 
  4.  * @createDate 2011-8-9 下午03:37:04 
  5.  */  
  6. @SuppressWarnings("unchecked")  
  7. @Test  
  8. public void modifyDoc() {  
  9.     try {  
  10.         Document doc = reader.read(new File("file/catalog.xml"));  
  11.           
  12.         //修改属性内容  
  13.         List list = doc.selectNodes("//article/@level");  
  14.         Iterator<Attribute> iter = list.iterator();  
  15.         while (iter.hasNext()) {  
  16.             Attribute attr = iter.next();  
  17.             fail(attr.getName() + "#" + attr.getValue() + "#" + attr.getText());  
  18.             if ("Intermediate".equals(attr.getValue())) {  
  19.                 //修改属性值  
  20.                 attr.setValue("Introductory");  
  21.                 fail(attr.getName() + "#" + attr.getValue() + "#" + attr.getText());  
  22.             }  
  23.         }  
  24.           
  25.         list = doc.selectNodes("//article/@date");  
  26.         iter = list.iterator();  
  27.         while (iter.hasNext()) {  
  28.             Attribute attr = iter.next();  
  29.             fail(attr.getName() + "#" + attr.getValue() + "#" + attr.getText());  
  30.             if ("December-2001".equals(attr.getValue())) {  
  31.                 //修改属性值  
  32.                 attr.setValue("December-2011");  
  33.                 fail(attr.getName() + "#" + attr.getValue() + "#" + attr.getText());  
  34.             }  
  35.         }  
  36.           
  37.         //修改节点内容  
  38.         list = doc.selectNodes("//article");  
  39.         Iterator<Element> it = list.iterator();  
  40.         while (it.hasNext()) {  
  41.             Element el = it.next();  
  42.             fail(el.getName() + "#" + el.getText() + "#" + el.getStringValue());  
  43.             //修改title元素  
  44.             Iterator<Element> elIter = el.elementIterator("title");  
  45.             while(elIter.hasNext()) {  
  46.                 Element titleEl = elIter.next();  
  47.                 fail(titleEl.getName() + "#" + titleEl.getText() + "#" + titleEl.getStringValue());  
  48.                 if ("Java configuration with XML Schema".equals(titleEl.getTextTrim())) {  
  49.                     //修改元素文本值  
  50.                     titleEl.setText("Modify the Java configuration with XML Schema");  
  51.                     fail(titleEl.getName() + "#" + titleEl.getText() + "#" + titleEl.getStringValue());  
  52.                 }  
  53.             }  
  54.         }  
  55.           
  56.         //修改节点子元素内容  
  57.         list = doc.selectNodes("//article/author");  
  58.         it = list.iterator();  
  59.         while (it.hasNext()) {  
  60.             Element el = it.next();  
  61.             fail(el.getName() + "#" + el.getText() + "#" + el.getStringValue());  
  62.             List<Element> childs = el.elements();  
  63.             for (Element e : childs) {  
  64.                 fail(e.getName() + "#" + e.getText() + "#" + e.getStringValue());  
  65.                 if ("Marcello".equals(e.getTextTrim())) {  
  66.                     e.setText("Ayesha");  
  67.                 } else if ("Vitaletti".equals(e.getTextTrim())) {  
  68.                     e.setText("Malik");  
  69.                 }   
  70.                 fail(e.getName() + "#" + e.getText() + "#" + e.getStringValue());  
  71.             }  
  72.         }  
  73.           
  74.         //写入到文件  
  75.         /*XMLWriter output = new XMLWriter(new FileWriter(new File("file/catalog-modified.xml"))); 
  76.         output.write(doc); 
  77.         output.close();*/  
  78.     } catch (DocumentException e) {  
  79.         e.printStackTrace();  
  80.     } catch (Exception e) {  
  81.         e.printStackTrace();  
  82.     }  
  83. }  
*  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;

 

#  显示文档相关信息

[java]  view plain copy print ?
  1. private String format(int i) {  
  2.     String temp = "";  
  3.     while (i > 0) {  
  4.         temp += "--";  
  5.         i--;  
  6.     }  
  7.     return temp;  
  8. }  
  9.   
  10. /** 
  11.  * <b>function:</b>递归显示文档内容 
  12.  * @author hoojo 
  13.  * @createDate 2011-8-9 下午03:43:45 
  14.  * @param i 
  15.  * @param els 
  16.  */  
  17. private void print(int i, List<Element> els) {  
  18.     i++;  
  19.     for (Element el : els) {  
  20.         fail(format(i) + "##" + el.getName() + "#" + el.getTextTrim());  
  21.         if (el.hasContent()) {  
  22.             print(i, el.elements());  
  23.         }   
  24.     }  
  25. }  
  26.   
  27. /** 
  28.  * <b>function:</b>显示文档相关信息 
  29.  * @author hoojo 
  30.  * @createDate 2011-8-9 下午03:44:10 
  31.  */  
  32. @Test  
  33. public void printInfo() {  
  34.     try {  
  35.         Document doc = reader.read(new File("file/catalog.xml"));  
  36.         fail("asXML: " + doc.asXML());  
  37.           
  38.         fail(doc.asXPathResult(new BaseElement("article")));  
  39.         List<Node> list = doc.content();  
  40.         for (Node node : list) {  
  41.             fail("Node: " + node.getName() + "#" + node.getText() + "#" + node.getStringValue());  
  42.         }  
  43.           
  44.         fail("-----------------------------");  
  45.         print(0, doc.getRootElement().elements());  
  46.           
  47.         fail("getDocType: " + doc.getDocType());  
  48.         fail("getNodeTypeName: " + doc.getNodeTypeName());  
  49.         fail("getPath: " + doc.getRootElement().getPath());  
  50.         fail("getPath: " + doc.getRootElement().getPath(new BaseElement("journal")));  
  51.         fail("getUniquePath: " + doc.getRootElement().getUniquePath());  
  52.         fail("getXMLEncoding: " + doc.getXMLEncoding());  
  53.         fail("hasContent: " + doc.hasContent());  
  54.         fail("isReadOnly: " + doc.isReadOnly());  
  55.         fail("nodeCount: " + doc.nodeCount());  
  56.         fail("supportsParent: " + doc.supportsParent());  
  57.     } catch (DocumentException e) {  
  58.         e.printStackTrace();  
  59.     }  
  60.     fail("getEncoding: " + reader.getEncoding());  
  61.     fail("isIgnoreComments: " + reader.isIgnoreComments());  
  62.     fail("isMergeAdjacentText: " + reader.isMergeAdjacentText());  
  63.     fail("isStringInternEnabled: " + reader.isStringInternEnabled());  
  64.     fail("isStripWhitespaceText: " + reader.isStripWhitespaceText());  
  65.     fail("isValidating: " + reader.isValidating());  
  66. }  

 

#  删除文档内容

[java]  view plain copy print ?
  1. /** 
  2.  * <b>function:</b> 删除节点内容 
  3.  * @author hoojo 
  4.  * @createDate 2011-8-9 下午03:47:44 
  5.  */  
  6. @Test  
  7. public void removeNode() {  
  8.     try {  
  9.         Document doc = reader.read(new File("file/catalog-modified.xml"));  
  10.         fail("comment: " + doc.selectSingleNode("//comment()"));  
  11.         //删除注释  
  12.         doc.getRootElement().remove(doc.selectSingleNode("//comment()"));  
  13.           
  14.         Element node = (Element) doc.selectSingleNode("//article");  
  15.         //删除属性  
  16.         node.remove(new DOMAttribute(QName.get("level"), "Introductory"));  
  17.         //删除元素 节点  
  18.         node.remove(doc.selectSingleNode("//title"));  
  19.           
  20.         //只能删除下一级节点,不能超过一级;(需要在父元素的节点上删除子元素)  
  21.         Node lastNameNode = node.selectSingleNode("//lastname");  
  22.         lastNameNode.getParent().remove(lastNameNode);  
  23.           
  24.         fail("Text: " + doc.selectObject("//*[text()='Ayesha']"));  
  25.         Element firstNameEl = (Element)doc.selectObject("//firstname");  
  26.         fail("Text: " + firstNameEl.selectSingleNode("text()"));  
  27.           
  28.         //删除text文本  
  29.         //firstNameEl.remove(firstNameEl.selectSingleNode("text()"));  
  30.         //firstNameEl.remove(doc.selectSingleNode("//firstname/text()"));  
  31.         firstNameEl.remove(doc.selectSingleNode("//*[text()='Ayesha']/text()"));  
  32.           
  33.         //删除子元素author  
  34.         //node.remove(node.selectSingleNode("//author"));  
  35.           
  36.         fail(doc.asXML());  
  37.     } catch (Exception e) {  
  38.         e.printStackTrace();  
  39.     }  
  40. }  

*  删除注释

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

删除root元素下面的注释

 

*  删除属性

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

删除node节点中的名称为level,其值为Introductory的属性

 

*  删除元素

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

删除node节点下的title元素

 

*  删除文本

firstNameEl.remove(firstNameEl.selectSingleNode("text()"));

firstNameEl.remove(doc.selectSingleNode("//firstname/text()"));

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

删除firstNameEl的文本内容


你可能感兴趣的:(xml)