Dom4j 解析xml
2016-07-07 09:33
134 查看
解析XML的方式有很多,本文介绍使用dom4j解析xml。
引自:http://blog.csdn.net/yyywyr/article/details/38359049
1、环境准备
(1)下载dom4j-1.6.1.jar
2、温馨提示
解析XML过程是通过获取Document对象,然后继续获取各个节点以及属性等操作,因此获取Document对象是第一步,大体说来,有三种方式:
(1)自己创建Document对象
其中students是根节点,可以继续添加其他节点等操作。
(2)读取XML文件获取Document对象
(3)读取XML文本内容获取Document对象
3、示例
(1)xml文件内容如下
(2)解析过程
(3)解析结果
4、dom4j操作节点属性
使用dom4j可以操作节点属性,比如添加节点属性、删除节点属性、修改属性值等操作。下面使用dom4j为上述的student1节点删除id属性,新添name属性。
(1)代码示例
(2)结果
5、dom4j新增节点
使用dom4j可以删除指定节点、新增节点等操作,我们使用dom4j为student1节点新增phone节点,如下。
(1)代码
(2)结果
6、把Document对象写入新的文件
有时,我们需要把document对象写入新的文件,dom4j提供了对应的API以便我们进行操作。我们在完成第 5 后,把document写入新的文件s1.xml,如下。
(1)代码
(2)查看s1.xml文件
因为涉及到中文,所以在输出时要设定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>
引自:http://blog.csdn.net/yyywyr/article/details/38359049
1、环境准备
(1)下载dom4j-1.6.1.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); 4000 } //遍历当前节点下的所有节点 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 phone:137xxxxxxxx
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>
相关文章推荐
- Android 热补丁动态修复框架小结
- c/c++使用指针做函数返回值和指针作函数参数问题
- Ajax的使用四大步骤
- 数据格式转换和数据格式扩展的区别与联系
- 差速锁与限滑差速器的区别
- printf实现
- mybatis 单一参数时的动态语句
- C#深拷贝 反射实现
- 如果不是因为你,还有谁值得
- 关于数组去重的小案例介绍
- swarm-run.sh
- android 6.0 healthd vold接收uevent
- ORA-32004:obsolete or deprecaated parameter(s) specified for RDBMS instance Oracle 12c Release 4000 1
- 杂谈社
- Docker学习总结(7)——云端基于Docker的微服务与持续交付实践
- 用Unity开发Flappy Bird
- C++中类的内存空间大小(sizeof)分析
- Maven本地仓库配置及修改Maven的本地仓库路径
- C/C++中函数参数传递详解
- Eddy's digital Roots