文档章节

JAVA 使用Dom4j 解析XML

Candy520
 Candy520
发布于 2015/10/19 15:25
字数 1967
阅读 84
收藏 3

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

1、环境准备

(1)下载dom4j-1.6.1.jar

(2)下载junit-4.10.jar

2、温馨提示

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

(1)自己创建Document对象

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. Document document = DocumentHelper.createDocument();  

  2.         Element root = document.addElement("students");  

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

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

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. //创建SAXReader对象  

  2.         SAXReader reader = new SAXReader();  

  3.         //读取文件 转换成Document  

  4.         Document document = reader.read(new File("XXXX.xml"));  

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

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. String xmlStr = "<students>......</students>";  

  2.         Document document = DocumentHelper.parseText(xmlStr);  

3、示例

(1)xml文件内容如下

[html] view plaincopyprint?在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 plaincopyprint?在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 plaincopyprint?在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 plaincopyprint?在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 plaincopyprint?在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 plaincopyprint?在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 plaincopyprint?在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 plaincopyprint?在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 plaincopyprint?在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 plaincopyprint?在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

共有 人打赏支持
Candy520
粉丝 49
博文 51
码字总数 63811
作品 0
深圳
私信 提问
XML解析(DOM、SAX、JDOM和DOM4J)

众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM、SAX、JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml-apis.jar包里 SA...

拷贝忍者卡卡习
2017/01/18
0
0
java解析xml的四种方法汇总

众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM、SAX、JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml-apis.jar包里 SA...

LYQ1990
2017/10/26
0
0
java解析xml文件四种方式介绍、性能比较和基本使用方法

一、基本介绍: 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特...

Candy_Desire
2014/08/20
0
0
Android 创建与解析XML(五)—— Dom4j方式

1、Dom4j概述 dom4j is an easy to use, open source library for working with XML, XPath and XSLT on the Java platform using the Java Collections Framework and with full support fo......

长平狐
2013/01/06
104
0
xml java应用(DOM、SAX、JDOM、DOM4j)简介比较

dom是解析xml的底层接口之一(另一种是sax) 而jdom和dom4j则是基于底层api的更高级封装 dom是通用的,而jdom和dom4j则是面向java语言的 DOM 是用与平台和语言无关的方式表示 XML 文档的官方 ...

liangyx
2012/12/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mosquitto 集群搭建

在Mosquitto集群中,客户端可以在任何节点上订阅主题,也可以在任何节点上发布消息,集群会保证消息按需转发到正确的节点。 为了均衡负载及避免单点故障,Mosquitto集群实现为完全去中心化、...

yanlijun_java
24分钟前
5
0
阿里高级技术专家:研发效能的追求永无止境

背景 大约在5年前,也就是2013年我刚加入阿里的时候,那个时候 DevOps 的风刚吹起来没多久,有家公司宣称能够一天发布几十上百次,这意味着相比传统软件公司几周一次的发布来说,他们响应商业...

阿里云云栖社区
28分钟前
1
0
正则匹配demo

要求:密码中有大写字母,小写字母,以及数字 package com.example.demo;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * @author seif * @Description: ...

经常把天聊死的胖子
28分钟前
5
0
阿里重磅开源首款自研科学计算引擎Mars,揭秘超大规模科学计算

日前,阿里巴巴正式对外发布了分布式科学计算引擎 Mars 的开源代码地址,开发者们可以在pypi上自主下载安装,或在Github上获取源代码并参与开发。 此前,早在2018年9月的杭州云栖大会上,阿里...

阿里云官方博客
29分钟前
3
0
在 Kubernetes 中配置私有 DNS 和上游域名服务器

Before you begin You need to have a Kubernetes cluster, and the kubectl command-line tool must be configured to communicate with your cluster. If you do not already have a clust......

xiaomin0322
38分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部