`

JAVA 使用Dom4j 解析XML

阅读更多

 

解析XML的方式有很多,本文介绍使用dom4j解析xml。

1、环境准备

(1)下载dom4j-1.6.1.jar

(2)下载junit-4.10.jar

2、温馨提示

解析XML过程是通过获取Document对象,然后继续获取各个节点以及属性等操作,因此获取Document对象是第一步,大体说来,有三种方式:

(1)自己创建Document对象

[java] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. Document document = DocumentHelper.createDocument();  
  2.         Element root = document.addElement("students");  

其中students是根节点,可以继续添加其他节点等操作。

 

(2)读取XML文件获取Document对象

[java] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. //创建SAXReader对象  
  2.         SAXReader reader = new SAXReader();  
  3.         //读取文件 转换成Document  
  4.         Document document = reader.read(new File("XXXX.xml"));  

(3)读取XML文本内容获取Document对象

 

 

[java] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. String xmlStr = "<students>......</students>";  
  2.         Document document = DocumentHelper.parseText(xmlStr);  

3、示例

 

(1)xml文件内容如下

[html] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <students>  
  3.     <student1 id="001">  
  4.         <微信公众号>@残缺的孤独</微信公众号>  
  5.         <学号>20140101</学号>  
  6.         <地址>北京海淀区</地址>  
  7.         <座右铭>要么强大,要么听话</座右铭>  
  8.     </student1>  
  9.     <student2 id="002">  
  10.         <新浪微博>@残缺的孤独</新浪微博>  
  11.         <学号>20140102</学号>  
  12.         <地址>北京朝阳区</地址>  
  13.         <座右铭>在哭泣中学会坚强</座右铭>  
  14.     </student2>  
  15. </students>  

(2)解析过程

[java] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. package cn.com.yy.dom4j;  
  2.   
  3. import java.io.File;  
  4. import java.util.Iterator;  
  5. import java.util.List;  
  6.   
  7. import org.dom4j.Attribute;  
  8. import org.dom4j.Document;  
  9. import org.dom4j.Element;  
  10. import org.dom4j.io.SAXReader;  
  11. import org.junit.Test;  
  12.   
  13. public class Dom4JforXML {  
  14.       
  15.     @Test  
  16.     public void test() throws Exception{  
  17.         //创建SAXReader对象  
  18.         SAXReader reader = new SAXReader();  
  19.         //读取文件 转换成Document  
  20.         Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));  
  21.         //获取根节点元素对象  
  22.         Element root = document.getRootElement();  
  23.         //遍历  
  24.         listNodes(root);  
  25.     }  
  26.       
  27.     //遍历当前节点下的所有节点  
  28.     public void listNodes(Element node){  
  29.         System.out.println("当前节点的名称:" + node.getName());  
  30.         //首先获取当前节点的所有属性节点  
  31.         List<Attribute> list = node.attributes();  
  32.         //遍历属性节点  
  33.         for(Attribute attribute : list){  
  34.             System.out.println("属性"+attribute.getName() +":" + attribute.getValue());  
  35.         }  
  36.         //如果当前节点内容不为空,则输出  
  37.         if(!(node.getTextTrim().equals(""))){  
  38.              System.out.println( node.getName() + ":" + node.getText());    
  39.         }  
  40.         //同时迭代当前节点下面的所有子节点  
  41.         //使用递归  
  42.         Iterator<Element> iterator = node.elementIterator();  
  43.         while(iterator.hasNext()){  
  44.             Element e = iterator.next();  
  45.             listNodes(e);  
  46.         }  
  47.     }  
  48. }  

(3)解析结果

[html] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. 当前节点的名称:students  
  2. 当前节点的名称:student1  
  3. 属性id:001  
  4. 当前节点的名称:微信公众号  
  5. 微信公众号:@残缺的孤独  
  6. 当前节点的名称:学号  
  7. 学号:20140101  
  8. 当前节点的名称:地址  
  9. 地址:北京海淀区  
  10. 当前节点的名称:座右铭  
  11. 座右铭:要么强大,要么听话  
  12. 当前节点的名称:student2  
  13. 属性id:002  
  14. 当前节点的名称:新浪微博  
  15. 新浪微博:@残缺的孤独  
  16. 当前节点的名称:学号  
  17. 学号:20140102  
  18. 当前节点的名称:地址  
  19. 地址:北京朝阳区  
  20. 当前节点的名称:座右铭  
  21. 座右铭:在哭泣中学会坚强  

4、dom4j操作节点属性

 

使用dom4j可以操作节点属性,比如添加节点属性、删除节点属性、修改属性值等操作。下面使用dom4j为上述的student1节点删除id属性,新添name属性。

(1)代码示例

[java] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. @Test  
  2.     public void test2()throws Exception{  
  3.         //创建SAXReader对象  
  4.         SAXReader reader = new SAXReader();  
  5.         //读取文件 转换成Document  
  6.         Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));  
  7.         //获取根节点元素对象  
  8.         Element root = document.getRootElement();  
  9.           
  10.         System.out.println("-------添加属性前------");  
  11.         //获取节点student1  
  12.         Element student1Element = root.element("student1");  
  13.         //遍历  
  14.         listNodes(student1Element);  
  15.         //获取其属性  
  16.         Attribute idAttribute = student1Element.attribute("id");  
  17.         //删除其属性  
  18.         student1Element.remove(idAttribute);  
  19.         //为其添加新属性  
  20.         student1Element.addAttribute("name""这是student1节点的新属性");  
  21.         System.out.println("-------添加属性后------");  
  22.         listNodes(student1Element);  
  23.     }  

(2)结果

[html] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. -------添加属性前------  
  2. 当前节点的名称:student1  
  3. <span style="background-color: rgb(255, 0, 0);">属性id:001</span>  
  4. 当前节点的名称:微信公众号  
  5. 微信公众号:@残缺的孤独  
  6. 当前节点的名称:学号  
  7. 学号:20140101  
  8. 当前节点的名称:地址  
  9. 地址:北京海淀区  
  10. 当前节点的名称:座右铭  
  11. 座右铭:要么强大,要么听话  
  12. -------添加属性后------  
  13. 当前节点的名称:student1  
  14. <span style="background-color: rgb(255, 255, 255);"><span style="color:#ff0000;">属性name:这是student1节点的新属性  
  15. </span></span>当前节点的名称:微信公众号  
  16. 微信公众号:@残缺的孤独  
  17. 当前节点的名称:学号  
  18. 学号:20140101  
  19. 当前节点的名称:地址  
  20. 地址:北京海淀区  
  21. 当前节点的名称:座右铭  
  22. 座右铭:要么强大,要么听话  

5、dom4j新增节点

 

使用dom4j可以删除指定节点、新增节点等操作,我们使用dom4j为student1节点新增phone节点,如下。

(1)代码

[java] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. //添加节点  
  2.     @Test  
  3.     public void test3()throws Exception{  
  4.         //创建SAXReader对象  
  5.         SAXReader reader = new SAXReader();  
  6.         //读取文件 转换成Document  
  7.         Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));  
  8.         //获取根节点元素对象  
  9.         Element root = document.getRootElement();  
  10.         System.out.println("-------添加节点前------");  
  11.         //获取节点student1  
  12.         Element student1Element = root.element("student1");  
  13.         //遍历  
  14.         listNodes(student1Element);  
  15.         //添加phone节点  
  16.         Element phoneElement = student1Element.addElement("phone");  
  17.         //为phone节点设置值  
  18.         phoneElement.setText("137xxxxxxxx");  
  19.         System.out.println("-------添加节点后------");  
  20.         listNodes(student1Element);  
  21.     }  

(2)结果

[html] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. -------添加节点前------  
  2. 当前节点的名称:student1  
  3. 属性id:001  
  4. 当前节点的名称:微信公众号  
  5. 微信公众号:@残缺的孤独  
  6. 当前节点的名称:学号  
  7. 学号:20140101  
  8. 当前节点的名称:地址  
  9. 地址:北京海淀区  
  10. 当前节点的名称:座右铭  
  11. 座右铭:要么强大,要么听话  
  12. -------添加节点后------  
  13. 当前节点的名称:student1  
  14. 属性id:001  
  15. 当前节点的名称:微信公众号  
  16. 微信公众号:@残缺的孤独  
  17. 当前节点的名称:学号  
  18. 学号:20140101  
  19. 当前节点的名称:地址  
  20. 地址:北京海淀区  
  21. 当前节点的名称:座右铭  
  22. 座右铭:要么强大,要么听话  
  23. 当前节点的名称:phone  
  24. <span style="color:#ff0000;">phone:137xxxxxxxx</span>  

6、把Document对象写入新的文件

 

有时,我们需要把document对象写入新的文件,dom4j提供了对应的API以便我们进行操作。我们在完成第 5 后,把document写入新的文件s1.xml,如下。

(1)代码

[java] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. //添加节点后,写入新的文件  
  2.     @Test  
  3.     public void test4()throws Exception{  
  4.         //创建SAXReader对象  
  5.         SAXReader reader = new SAXReader();  
  6.         //读取文件 转换成Document  
  7.         Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));  
  8.         //获取根节点元素对象  
  9.         Element root = document.getRootElement();  
  10.         System.out.println("-------添加节点前------");  
  11.         //获取节点student1  
  12.         Element student1Element = root.element("student1");  
  13.         //遍历  
  14.         listNodes(student1Element);  
  15.         //添加phone节点  
  16.         Element phoneElement = student1Element.addElement("phone");  
  17.         //为phone节点设置值  
  18.         phoneElement.setText("137xxxxxxxx");  
  19.         System.out.println("-------添加节点后------");  
  20.         listNodes(student1Element);  
  21.         //把student1Element写入新文件  
  22.         writerDocumentToNewFile(document);  
  23.         System.out.println("---写入完毕----");  
  24.     }  
  25.       
  26.     //document写入新的文件  
  27.     public void writerDocumentToNewFile(Document document)throws Exception{  
  28.         //输出格式  
  29.         OutputFormat format = OutputFormat.createPrettyPrint();  
  30.         //设置编码  
  31.         format.setEncoding("UTF-8");  
  32.         //XMLWriter 指定输出文件以及格式  
  33.         XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(new File("src/cn/com/yy/dom4j/s1.xml")),"UTF-8"), format);  
  34.           
  35.         //写入新文件  
  36.         writer.write(document);  
  37.         writer.flush();  
  38.         writer.close();  
  39.     }  

(2)查看s1.xml文件

[html] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <students>   
  4.   <student1 id="001">   
  5.     <微信公众号>@残缺的孤独</微信公众号>    
  6.     <学号>20140101</学号>    
  7.     <地址>北京海淀区</地址>    
  8.     <座右铭>要么强大,要么听话</座右铭>    
  9.     <phone>137xxxxxxxx</phone>  
  10.   </student1>    
  11.   <student2 id="002">   
  12.     <新浪微博>@残缺的孤独</新浪微博>    
  13.     <学号>20140102</学号>    
  14.     <地址>北京朝阳区</地址>    
  15.     <座右铭>在哭泣中学会坚强</座右铭>   
  16.   </student2>   
  17. </students>  

因为涉及到中文,所以在输出时要设定UTF8编码,OutputStreamWriter进行设置编码。

 

还有输出格式的问题,在此处使用的是OutputFormat.createPrettyPrint(),输出文档时进行了排版格式化。还有一种是OutputFormat.createCompactFormat()方法,输出内容是一行,没有进行格式化,是紧凑型的输出。如下:

 

[html] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <students><student1 id="001"><微信公众号>@残缺的孤独</微信公众号><学号>20140101</学号><地址>北京海淀区</地址><座右铭>要么强大,要么听话</座右铭><phone>137xxxxxxxx</phone></student1><student2 id="002"><新浪微博>@残缺的孤独</新浪微博><学号>20140102</学号><地址>北京朝阳区</地址><座右铭>在哭泣中学会坚强</座右铭></student2></students> 

 

http://blog.csdn.net/yyywyr/article/details/38359049

分享到:
评论

相关推荐

    Java使用sax、dom、dom4j解析xml文档

    Java提供了多种解析XML的API,包括SAX(Simple API for XML)、DOM(Document Object Model)以及DOM4J。下面我们将详细探讨这些解析方式及其在实际开发中的应用。 1. SAX解析器: SAX是一种基于事件驱动的解析器,...

    java dom4j解析xml

    Java DOM4J解析XML是一种常见的处理XML文档的技术,它提供了灵活且高效的API,使得开发者能够方便地读取、写入、修改以及操作XML文件。DOM4J是Java中一个非常强大的XML处理库,它结合了DOM、SAX和JDOM的优点,同时也...

    dom4j解析xml详解

    ### DOM4J解析XML详解 #### 一、DOM4J简介与特性 DOM4J是一个由dom4j.org开发的开源XML解析包,专为Java平台设计,它不仅支持DOM、SAX和JAXP标准,还巧妙地融入了Java集合框架,使其成为Java开发者在处理XML数据时...

    java dom4j 解析xml的例子,可用

    2. **基本用法**:在Java程序中,首先需要导入dom4j库,然后使用`DocumentBuilderFactory`创建`DocumentBuilder`,接着使用`DocumentBuilder`解析XML文件,得到`Document`对象。你可以通过`Document`对象获取XML的根...

    dom4j解析xml文件的压缩包

    5. **事件驱动解析(SAX)**:除了传统的DOM解析外,DOM4J还支持SAX解析器,这种解析方式适用于处理大型XML文件,因为它不需要一次性加载整个文档到内存。 6. **Namespace支持**:DOM4J提供了对XML命名空间的全面...

    dom4j 解析写入xml

    1、xml文档解析 2、 dom4j解析xml 3、实现xml文件解析 xml字符串解析 xml MAP键值对解析 4、实现xml写入与生成文件

    java_Dom4j解析XML详解

    Java DOM4J解析XML详解 XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置文件和文档存储等领域。DOM4J是Java中一个强大的、轻量级的处理XML的库,它提供了丰富的API来读取、...

    使用dom4j解析XML

    【使用dom4j解析XML】 dom4j是一个强大的开源XML框架,它提供了处理XML文档的各种功能,包括解析、创建、修改等。相比W3C DOM API,dom4j的优势在于其内置的XPath支持,允许更方便地定位和操作XML文档中的节点。 *...

    dom4j解析xml实例

    通过学习和实践这些基本操作,你可以熟练掌握DOM4J解析XML的技巧,为你的Java项目中处理XML数据提供强大的支持。在项目中遇到具体问题时,可以参考DOM4J的官方文档,或利用在线资源进行更深入的学习。

    dom4j解析xml文件(增删改查)

    在“dom4j解析xml文件(增删改查)”这个主题中,我们将深入探讨如何使用DOM4J来实现XML文档的四种基本操作:增加元素、删除元素、更新元素内容以及查询元素。 首先,让我们了解DOM4J的基本用法。在解析XML文件时,...

    DOM4J 解析XML

    DOM4J不仅是一个解析XML的工具,还可以用作XML数据绑定库,将XML数据映射到Java对象。此外,DOM4J还支持Java 5的注解,这使得XML文档的处理更加直观和简洁。结合其灵活性和高性能,DOM4J成为Java开发人员处理XML文档...

    dom4j解析XML所需要的jar包

    为了在Java项目中使用DOM4J解析XML,你需要将这两个jar文件(dom4j-1.6.1和jaxen-1.1-beta-7.jar)添加到你的类路径(classpath)中。这可以通过在IDE中配置构建路径,或者在命令行中指定 `-cp` 参数来完成。一旦...

    dom4j 解析(读取) xml 节点数据

    要开始解析XML文件,首先需要导入DOM4J的相关包: ```java import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; ``` 接下来,我们将创建...

    dom4j 解析xml实例

    在这个实例中,我们将深入探讨如何使用DOM4J解析XML文件,并通过`Dom4jTest1.java`这个示例程序来理解其工作原理。 首先,我们需要了解XML(Extensible Markup Language)是一种标记语言,常用于存储和传输数据。...

    dom4j解析xml

    在提供的文件列表中,`Test.java`可能包含使用DOM4J解析XML的示例代码。通常,这样的代码会包含以下部分: ```java import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; // ...

    dom4j解析XML所需jar包

    DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了灵活且高效的API,使得XML的解析、创建、修改和查询变得简单。DOM4J的名字来源于DOM(Document Object Model)和Java的结合,但它的设计理念比标准DOM更先进...

    java用dom4j解析xml

    本节将深入探讨Java中解析XML的方法,特别是使用DOM4J库进行解析。 XML解析方法主要有四种:DOM(文档对象模型)、SAX(简单API for XML)、StAX(流式API for XML)以及DOM4J。每种方法都有其特定的优势和适用场景...

    分别使用DOM和DOM4j解析XML文件

    使用DOM解析XML的基本步骤如下: 1. 创建DocumentBuilderFactory实例。 2. 使用DocumentBuilderFactory创建DocumentBuilder实例。 3. 使用DocumentBuilder的parse()方法解析XML文件,得到Document对象。 4. 通过...

Global site tag (gtag.js) - Google Analytics