文档章节

JAVA 使用Dom4j 解析XML

Candy520
 Candy520
发布于 2015/10/19 15:25
字数 1967
阅读 82
收藏 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
粉丝 50
博文 51
码字总数 63811
作品 0
深圳
私信 提问
java解析xml的四种方法汇总

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

LYQ1990
2017/10/26
0
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
java解析xml文件四种方式介绍、性能比较和基本使用方法

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

Candy_Desire
2014/08/20
0
0
java解析xml -- DOM4J JDOM DOM SAX 之比较

DOM4J http://dom4j.sourceforge.net 虽然DOM4J代表了完全独立的开发结果,但最初,它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以...

o0江湖郎中0o
2014/01/07
0
2
详解Java解析XML的四种方法

XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML。本文将详细介绍用Java解析XML的四种方法。 XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关...

hchen1982
2011/08/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

day150-2018-11-17-英语流利阅读-待学习

歪果仁也疯狂:海外版抖音的征途 毛西 2018-11-17 1.今日导读 海外版抖音 TikTok 于 2017 年 5 月上线海外,至今覆盖全球 150 多个国家和地区,月活跃用户数已突破 5 亿。然而,“出海”的抖...

飞鱼说编程
今天
4
0
分布式学习最佳实践:从分布式系统的特征开始(附思维导图)

什么是分布式系统 回到顶部   分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法...

dragon_tech
今天
4
0
TOKEN设计

TOKEN设计 Api_Token 首先需要知道API是什么? API(Application Programming Interface)即应用程序接口。你可以认为 API 是一个软件组件或是一个 Web 服务与外界进行的交互的接口。而我们在...

DrChenXX
今天
3
0
浅谈“李氏代换”——从纪念金庸和斯坦李说起

李氏代换(LSP)简介 李氏代换是软件设计的一个原则,又名依赖倒转原则或依赖倒置原则,其衍生原则有接口分离原则等。该原则由Barbara Liskov于1988年提出。 该原则指出,程序中高级别的元素...

SamYjy
今天
33
0
JavaScript实现在线websocket WSS测试工具 -toolfk程序员工具网

本文要推荐的[ToolFk]是一款程序员经常使用的线上免费测试工具箱,ToolFk 特色是专注于程序员日常的开发工具,不用安装任何软件,只要把内容贴上按一个执行按钮,就能获取到想要的内容结果。T...

toolfk
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部