【收藏用】--切勿转载JAVA 使用Dom4j 解析XML
原帖地址 : http://blog.csdn.NET/yyywyr/article/details/38359049
解析XML的方式有很多,本文介绍使用dom4j解析xml。
1、环境准备
(1)下载dom4j-1.6.1.jar
(2)下载junit-4.10.jar
2、温馨提示
解析XML过程是通过获取Document对象,然后继续获取各个节点以及属性等操作,因此获取Document对象是第一步,大体说来,有三种方式:
(1)自己创建Document对象
- Document document = DocumentHelper.createDocument();
- Element root = document.addElement("students");
其中students是根节点,可以继续添加其他节点等操作。
(2)读取XML文件获取Document对象
- //创建SAXReader对象
- SAXReader reader = new SAXReader();
- //读取文件 转换成Document
- Document document = reader.read(new File("XXXX.xml"));
(3)读取XML文本内容获取Document对象
- String xmlStr = "<students>......</students>";
- Document document = DocumentHelper.parseText(xmlStr);
3、示例
(1)xml文件内容如下
- <?xml version="1.0" encoding="UTF-8"?>
- <students>
- <student1 id="001">
- <微信公众号>@残缺的孤独</微信公众号>
- <学号>20140101</学号>
- <地址>北京海淀区</地址>
- <座右铭>要么强大,要么听话</座右铭>
- </student1>
- <student2 id="002">
- <新浪微博>@残缺的孤独</新浪微博>
- <学号>20140102</学号>
- <地址>北京朝阳区</地址>
- <座右铭>在哭泣中学会坚强</座右铭>
- </student2>
- </students>
(2)解析过程
- package cn.com.yy.dom4j;
- import java.io.File;
- import java.util.Iterator;
- import java.util.List;
- import org.dom4j.Attribute;
- import org.dom4j.Document;
- import org.dom4j.Element;
- import org.dom4j.io.SAXReader;
- import org.junit.Test;
- public class Dom4JforXML {
- @Test
- public void test() throws Exception{
- //创建SAXReader对象
- SAXReader reader = new SAXReader();
- //读取文件 转换成Document
- Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));
- //获取根节点元素对象
- Element root = document.getRootElement();
- //遍历
- listNodes(root);
- }
- //遍历当前节点下的所有节点
- public void listNodes(Element node){
- System.out.println("当前节点的名称:" + node.getName());
- //首先获取当前节点的所有属性节点
- List<Attribute> list = node.attributes();
- //遍历属性节点
- for(Attribute attribute : list){
- System.out.println("属性"+attribute.getName() +":" + attribute.getValue());
- }
- //如果当前节点内容不为空,则输出
- if(!(node.getTextTrim().equals(""))){
- System.out.println( node.getName() + ":" + node.getText());
- }
- //同时迭代当前节点下面的所有子节点
- //使用递归
- Iterator<Element> iterator = node.elementIterator();
- while(iterator.hasNext()){
- Element e = iterator.next();
- listNodes(e);
- }
- }
- }
(3)解析结果
- 当前节点的名称:students
- 当前节点的名称:student1
- 属性id:001
- 当前节点的名称:微信公众号
- 微信公众号:@残缺的孤独
- 当前节点的名称:学号
- 学号:20140101
- 当前节点的名称:地址
- 地址:北京海淀区
- 当前节点的名称:座右铭
- 座右铭:要么强大,要么听话
- 当前节点的名称:student2
- 属性id:002
- 当前节点的名称:新浪微博
- 新浪微博:@残缺的孤独
- 当前节点的名称:学号
- 学号:20140102
- 当前节点的名称:地址
- 地址:北京朝阳区
- 当前节点的名称:座右铭
- 座右铭:在哭泣中学会坚强
4、dom4j操作节点属性
使用dom4j可以操作节点属性,比如添加节点属性、删除节点属性、修改属性值等操作。下面使用dom4j为上述的student1节点删除id属性,新添name属性。
(1)代码示例
- @Test
- public void test2()throws Exception{
- //创建SAXReader对象
- SAXReader reader = new SAXReader();
- //读取文件 转换成Document
- Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));
- //获取根节点元素对象
- Element root = document.getRootElement();
- System.out.println("-------添加属性前------");
- //获取节点student1
- Element student1Element = root.element("student1");
- //遍历
- listNodes(student1Element);
- //获取其属性
- Attribute idAttribute = student1Element.attribute("id");
- //删除其属性
- student1Element.remove(idAttribute);
- //为其添加新属性
- student1Element.addAttribute("name", "这是student1节点的新属性");
- System.out.println("-------添加属性后------");
- listNodes(student1Element);
- }
(2)结果
- -------添加属性前------
- 当前节点的名称:student1
- <span style="background-color: rgb(255, 0, 0);">属性id:001</span>
- 当前节点的名称:微信公众号
- 微信公众号:@残缺的孤独
- 当前节点的名称:学号
- 学号:20140101
- 当前节点的名称:地址
- 地址:北京海淀区
- 当前节点的名称:座右铭
- 座右铭:要么强大,要么听话
- -------添加属性后------
- 当前节点的名称:student1
- <span style="background-color: rgb(255, 255, 255);"><span style="color:#ff0000;">属性name:这是student1节点的新属性
- </span></span>当前节点的名称:微信公众号
- 微信公众号:@残缺的孤独
- 当前节点的名称:学号
- 学号:20140101
- 当前节点的名称:地址
- 地址:北京海淀区
- 当前节点的名称:座右铭
- 座右铭:要么强大,要么听话
5、dom4j新增节点
使用dom4j可以删除指定节点、新增节点等操作,我们使用dom4j为student1节点新增phone节点,如下。
(1)代码
- //添加节点
- @Test
- public void test3()throws Exception{
- //创建SAXReader对象
- SAXReader reader = new SAXReader();
- //读取文件 转换成Document
- Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));
- //获取根节点元素对象
- Element root = document.getRootElement();
- System.out.println("-------添加节点前------");
- //获取节点student1
- Element student1Element = root.element("student1");
- //遍历
- listNodes(student1Element);
- //添加phone节点
- Element phoneElement = student1Element.addElement("phone");
- //为phone节点设置值
- phoneElement.setText("137xxxxxxxx");
- System.out.println("-------添加节点后------");
- listNodes(student1Element);
- }
(2)结果
- -------添加节点前------
- 当前节点的名称:student1
- 属性id:001
- 当前节点的名称:微信公众号
- 微信公众号:@残缺的孤独
- 当前节点的名称:学号
- 学号:20140101
- 当前节点的名称:地址
- 地址:北京海淀区
- 当前节点的名称:座右铭
- 座右铭:要么强大,要么听话
- -------添加节点后------
- 当前节点的名称:student1
- 属性id:001
- 当前节点的名称:微信公众号
- 微信公众号:@残缺的孤独
- 当前节点的名称:学号
- 学号:20140101
- 当前节点的名称:地址
- 地址:北京海淀区
- 当前节点的名称:座右铭
- 座右铭:要么强大,要么听话
- 当前节点的名称:phone
- <span style="color:#ff0000;">phone:137xxxxxxxx</span>
6、把Document对象写入新的文件
有时,我们需要把document对象写入新的文件,dom4j提供了对应的API以便我们进行操作。我们在完成第 5 后,把document写入新的文件s1.xml,如下。
(1)代码
- //添加节点后,写入新的文件
- @Test
- public void test4()throws Exception{
- //创建SAXReader对象
- SAXReader reader = new SAXReader();
- //读取文件 转换成Document
- Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));
- //获取根节点元素对象
- Element root = document.getRootElement();
- System.out.println("-------添加节点前------");
- //获取节点student1
- Element student1Element = root.element("student1");
- //遍历
- listNodes(student1Element);
- //添加phone节点
- Element phoneElement = student1Element.addElement("phone");
- //为phone节点设置值
- phoneElement.setText("137xxxxxxxx");
- System.out.println("-------添加节点后------");
- listNodes(student1Element);
- //把student1Element写入新文件
- writerDocumentToNewFile(document);
- System.out.println("---写入完毕----");
- }
- //document写入新的文件
- public void writerDocumentToNewFile(Document document)throws Exception{
- //输出格式
- OutputFormat format = OutputFormat.createPrettyPrint();
- //设置编码
- format.setEncoding("UTF-8");
- //XMLWriter 指定输出文件以及格式
- XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(new File("src/cn/com/yy/dom4j/s1.xml")),"UTF-8"), format);
- //写入新文件
- writer.write(document);
- writer.flush();
- writer.close();
- }
(2)查看s1.xml文件
- <?xml version="1.0" encoding="UTF-8"?>
- <students>
- <student1 id="001">
- <微信公众号>@残缺的孤独</微信公众号>
- <学号>20140101</学号>
- <地址>北京海淀区</地址>
- <座右铭>要么强大,要么听话</座右铭>
- <phone>137xxxxxxxx</phone>
- </student1>
- <student2 id="002">
- <新浪微博>@残缺的孤独</新浪微博>
- <学号>20140102</学号>
- <地址>北京朝阳区</地址>
- <座右铭>在哭泣中学会坚强</座右铭>
- </student2>
- </students>
因为涉及到中文,所以在输出时要设定UTF8编码,OutputStreamWriter进行设置编码。
还有输出格式的问题,在此处使用的是OutputFormat.createPrettyPrint(),输出文档时进行了排版格式化。还有一种是OutputFormat.createCompactFormat()方法,输出内容是一行,没有进行格式化,是紧凑型的输出。如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <students><student1 id="001"><微信公众号>@残缺的孤独</微信公众号><学号>20140101</学号><地址>北京海淀区</地址><座右铭>要么强大,要么听话</座右铭><phone>137xxxxxxxx</phone></student1><student2 id="002"><新浪微博>@残缺的孤独</新浪微博><学号>20140102</学号><地址>北京朝阳区</地址><座右铭>在哭泣中学会坚强</座右铭></student2></students>
最后,为大家附上源代码。java dom4j解析xml
【收藏用】--切勿转载JAVA 使用Dom4j 解析XML的更多相关文章
- java使用dom4j解析xml文件
关于xml的知识,及作用什么的就不说了,直接解释如何使用dom4j解析.假如有如下xml: dom4j解析xml其实很简单,只要你有点java基础,知道xml文件.结合下面的xml文件和java代码, ...
- JAVA 使用Dom4j 解析XML
[转自] http://blog.csdn.net/yyywyr/article/details/38359049 解析XML的方式有很多,本文介绍使用dom4j解析xml. 1.环境准备 (1)下载 ...
- 【收藏用】--切勿转载Java处理XML的三种主流技术及介绍
原帖地址 : http://www.ibm.com/developerworks/cn/xml/dm-1208gub/ XML (eXtensible Markup Language) 意为可扩展标记 ...
- Java中Dom4j解析XML
与利用DOM.SAX.JAXP机制来解析xml相比DOM4J表现更优秀,具有性能优异.功能强大和极端易用使用的特点,只要懂得DOM基本概念,就可以通过dom4j的api文档来解析xml.dom4j是一 ...
- java三方---->dom4j解析xml数据
Dom4j是一个易用的.开源的库,用于XML,XPath和XSLT.它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP.今天我们就开始Dom4j的学习. Dom4j的使用 ...
- java 之 dom4j解析xml
*dom4j,是一个组织,针对xml解析,提供解析器dom4j *dom4j不是javase的一部分,想要使用需要导入dom4j提供的jar包 *第一步:创建lib文件夹,将压缩文件放到此处 *第二步 ...
- 转:在java中使用dom4j解析xml
JAVA 使用Dom4j 解析XML Java DOM4J Parser - Parse XML Document Dom4j下载及使用Dom4j读写XML简介 在java中使用dom4j解析xml ...
- java dom4j解析xml实例(2)
java利用dom4j解析xml 需要的jar包: dom4j官方网站在 http://www.dom4j.org/ 下载dom4j-1.6.1.zip 解开后有两个包,仅操作XML文档的话把dom4 ...
- java dom4j解析xml实例
java利用dom4j解析xml 需要的jar包: dom4j官方网站在 http://www.dom4j.org/ 下载dom4j-1.6.1.zip 解开后有两个包,仅操作XML文档的话把dom4 ...
随机推荐
- 从开发的角度比较 ASP.NET Web 服务与 WCF
Windows Communication Foundation (WCF) 具有一个 ASP.NET 兼容模式选项,用户使用此选项可以对 WCF 应用程序进行编程和配置,使其像 ASP.NET We ...
- SQLServer 执行计划
http://www.cnblogs.com/fish-li/archive/2011/06/06/2073626.html#_label0 http://www.jb51.net/article ...
- oracle-asm,acfs
两个类比asm与lvm比较asm实例与oracle实例比较 ASM是OMF的一个扩展,通过ASM和OMF的结合,oracle在上层将数据文件进行自我管理,在底层将存储进行自我管理.同时,ASM模式下, ...
- 解决Oracle 11g在用EXP导出时,空表不能导出
实践结论可行,看"2.解决办法" 一.问题原因: 11G中有个新特性,当表无数据时,不分配segment,以节省空间 1.insert一行,再rollback就产生 ...
- 【性能诊断】六、并发场景的性能分析(windbg案例,大量的内部异常造成CPU飙升)
在做产品的某个核心模块的性能优化时,发现压到100并发时应用服务器的CPU就飙升至90%以上,50并发以后TPS就基本定格在一个数值上.使用性能监视器收集应用服务器的数据,发现每秒的.NET CLR ...
- ContentProvider 使用示例(转载)
ContentProvider 使用示例(转载) 当数据需要在应用程序间共享时,我们就可以利用ContentProvider为数据定义一个URI.之后其他应用程序对数据进行查询或者修改时,只需要从当前 ...
- 如何创建自己的docker image并上传到DockerHub上
这里,记录一下比较常用的docker操作细节,对于初次使用者,可能有很大的帮助. docker作为云计算Paas层面的东西,风靡全世界了,主要是因为它小巧,好用,功能强大.今天主要介绍一下如何依据自己 ...
- 如何通过源码生成Gatling可执行工具
其实,这个对于不是很熟系sbt的人来说,或者对scala语言没有什么了解的人,接触Gatling这个开源的性能测试框架,还是有些茫然的. 因为GitHub上提供的Gatling (最新版本:2.2.0 ...
- ASIHttpRequest addRequestHeader的处理
我现在用到了ASIHttpRequest来读取数据,这时候我发现里面的头在很多时候都是一样的.如用户的令牌,设备类型,ios版本,软件版本等 [self.request addRequestHeade ...
- [转]UOS 中的虚拟网络设备
随着网络技术,虚拟化技术的发展,越来越多的高级网络设备被加入了到了 Linux 中,这些设备在 UOS 中起到了广泛而关键的作用,包括 Open vSwitch.TAP 设备.Veth 设备等等,梳理 ...