[转自] 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对象

  1. Document document = DocumentHelper.createDocument();
  2. Element root = document.addElement("students");

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

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

  1. //创建SAXReader对象
  2. SAXReader reader = new SAXReader();
  3. //读取文件 转换成Document
  4. Document document = reader.read(new File("XXXX.xml"));

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

  1. String xmlStr = "<students>......</students>";
  2. Document document = DocumentHelper.parseText(xmlStr);

3、示例

(1)xml文件内容如下

  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)解析过程

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

(3)解析结果

  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)代码示例

  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. System.out.println("-------添加属性前------");
  10. //获取节点student1
  11. Element student1Element = root.element("student1");
  12. //遍历
  13. listNodes(student1Element);
  14. //获取其属性
  15. Attribute idAttribute = student1Element.attribute("id");
  16. //删除其属性
  17. student1Element.remove(idAttribute);
  18. //为其添加新属性
  19. student1Element.addAttribute("name", "这是student1节点的新属性");
  20. System.out.println("-------添加属性后------");
  21. listNodes(student1Element);
  22. }

(2)结果

  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)代码

  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)结果

  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)代码

  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. //document写入新的文件
  26. public void writerDocumentToNewFile(Document document)throws Exception{
  27. //输出格式
  28. OutputFormat format = OutputFormat.createPrettyPrint();
  29. //设置编码
  30. format.setEncoding("UTF-8");
  31. //XMLWriter 指定输出文件以及格式
  32. XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(new File("src/cn/com/yy/dom4j/s1.xml")),"UTF-8"), format);
  33. //写入新文件
  34. writer.write(document);
  35. writer.flush();
  36. writer.close();
  37. }

(2)查看s1.xml文件

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

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

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <students><student1 id="001"><微信公众号>@残缺的孤独</微信公众号><学号>20140101</学号><地址>北京海淀区</地址><座右铭>要么强大,要么听话</座右铭><phone>137xxxxxxxx</phone></student1><student2 id="002"><新浪微博>@残缺的孤独</新浪微博><学号>20140102</学号><地址>北京朝阳区</地址><座右铭>在哭泣中学会坚强</座右铭></student2></students>

最后,为大家附上源代码。java dom4j解析xml

JAVA 使用Dom4j 解析XML的更多相关文章

  1. java使用dom4j解析xml文件

    关于xml的知识,及作用什么的就不说了,直接解释如何使用dom4j解析.假如有如下xml: dom4j解析xml其实很简单,只要你有点java基础,知道xml文件.结合下面的xml文件和java代码, ...

  2. 【收藏用】--切勿转载JAVA 使用Dom4j 解析XML

    原帖地址 : http://blog.csdn.NET/yyywyr/article/details/38359049 解析XML的方式有很多,本文介绍使用dom4j解析xml. 1.环境准备 (1) ...

  3. Java中Dom4j解析XML

    与利用DOM.SAX.JAXP机制来解析xml相比DOM4J表现更优秀,具有性能优异.功能强大和极端易用使用的特点,只要懂得DOM基本概念,就可以通过dom4j的api文档来解析xml.dom4j是一 ...

  4. java三方---->dom4j解析xml数据

    Dom4j是一个易用的.开源的库,用于XML,XPath和XSLT.它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP.今天我们就开始Dom4j的学习. Dom4j的使用 ...

  5. java 之 dom4j解析xml

    *dom4j,是一个组织,针对xml解析,提供解析器dom4j *dom4j不是javase的一部分,想要使用需要导入dom4j提供的jar包 *第一步:创建lib文件夹,将压缩文件放到此处 *第二步 ...

  6. 转:在java中使用dom4j解析xml

    JAVA 使用Dom4j 解析XML Java DOM4J Parser - Parse XML Document Dom4j下载及使用Dom4j读写XML简介 在java中使用dom4j解析xml ...

  7. java dom4j解析xml实例(2)

    java利用dom4j解析xml 需要的jar包: dom4j官方网站在 http://www.dom4j.org/ 下载dom4j-1.6.1.zip 解开后有两个包,仅操作XML文档的话把dom4 ...

  8. java dom4j解析xml实例

    java利用dom4j解析xml 需要的jar包: dom4j官方网站在 http://www.dom4j.org/ 下载dom4j-1.6.1.zip 解开后有两个包,仅操作XML文档的话把dom4 ...

  9. java中采用dom4j解析xml文件

    一.前言 在最近的开发中用到了dom4j来解析xml文件,以前听说过来解析xml文件的几种标准方式:但是从来的没有应用过来,所以可以在google中搜索dmo4j解析xml文件的方式,学习一下dom4 ...

随机推荐

  1. Hyperledger项目中使用的工具

    Hyperledger作为一个众多IT厂商参与的项目,全球化的开源社区,其项目的组织形式.流程.工具,都值得借鉴.好工匠离不开好工具,我注意到Hyperledger项目中使用了大量的好工具,包括项目管 ...

  2. HDU 5293 Tree chain problem

    树状数组 + dp 设$f_i$表示以$i$为根的子树中的能选取的最大和,$sum_x$表示$\sum_{f_y}$  ($y$是$x$的一个儿子),这样子我们把所有给出的链按照两点的$lca$分组, ...

  3. 简单的Cooki案例——记录用户上次访问该网页的时间

    功能: 帮助网站实现提示客户端计算机上次访问网站的时间 实现原理: 将每一个会话作为一次访问过程,将每次会话的开始时间作为每次访问网站的时间,然后将这个时间以Cookie的形式存储到客户端的计算机中, ...

  4. poj 1611 The Suspects(第一道并查集)

    题意: 有N个学生,编号为0-n-1,现在0号学生感染了非典,凡是和0在一个社团的人就会感染, 并且这些人如果还参加了别的社团,他所在的社团照样全部感染,社团个数为m,求感染的人数. 输入: n代表人 ...

  5. 在Global.asax文件的Application_BeginRequest中获取request请求内容

    protected void Application_BeginRequest(object sender, EventArgs e) { try { string isLogRequest = Sy ...

  6. Mapper配置文件夹

    <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-// ...

  7. LibreOJ 6281 数列分块入门 5(分块区间开方区间求和)

    题解:区间开方emmm,这马上让我想起了当时写线段树的时候,很显然,对于一个在2^31次方以内的数,开方7-8次就差不多变成一了,所以我们对于每次开方,如果块中的所有数都为一了,那么开方也没有必要了. ...

  8. 关于 XML 字段内容查询

    找到个总结相当好的知识点的归纳,记在自己的博客里也方便查询 /* sql xml 入门:     --by jinjazz     --http://blog.csdn.net/jinjazz     ...

  9. Sobel算法

    最近看了一些Sobel算法,并试了一下,源码如下: private void Sobel(Bitmap img) { int width = img.Width; int height = img.H ...

  10. Expression表单式树

    余于项目中逢Expression(表达式树),然今未明其用途也,记之以温. using System; using System.Collections.Generic; using System.L ...