[转自] 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. 数字图像处理实验(15):PROJECT 06-02,Pseudo-Color Image Processing 标签: 图像处理MATLAB 2017-05-27 20:53

    实验要求: 上面的实验要求中Objective(实验目的)部分是错误的. 然而在我拿到的大纲中就是这么写的,所以请忽视那部分,其余部分是没有问题的. 本实验是使用伪彩色强调突出我们感兴趣的灰度范围,在 ...

  2. EZOJ #202

    传送门 分析 我们知道选一个点的代价就是他所有出边边权的异或和 由于一条边如果两个端点均选边权会异或两次变回0,所以不必担心重复的情况 于是直接跑线性基即可 代码 #include<bits/s ...

  3. 解决IE与FF 中 input focus 光标移动在最后的方案

    只要把input元素的id传进来即可 function moveCursor(id)  { var id = document.getElementById(id); id.focus(); var  ...

  4. 何为软件的Alpha、Beta、RC和GA发布版本?

    简介 一个软件或者一个功能在发布时,通常会有Beta版这么一说.我很熟悉,差不多知道是什么意思,但没去深究,感觉上就是一个可以用但不保证功能稳定的版本. 直到昨天我看到了 MariaDB 数据库发布标 ...

  5. Visual Studio OpenCV 开发环境配置

    因为VS配置OpenCV好多新手都很难一次配置成功,而且OpenCV库每新建一个项目都要配置很是麻烦,所以今天就给大家介绍一个“一劳永逸”的方法. 注:理论上只要VS和OpenCV是版本兼容的,该方法 ...

  6. ios PNG Crush error (PNG图片错误)

    我是这么解决的: I had the same problem. How to fix : Open up image with Preview -> File > Export > ...

  7. 解决linux下80端口占用问题

    在即安装有tomcat,又安装有nginx的服务器上(典型阿里云驻云java镜像),系统默认配置nginx占用80端口,tomcat占用8080端口. 如果想要便于用户可以直接通过IP或者域名访问到t ...

  8. LeetCode(258.各位相加)的思路及解决过程

    问题如下: 给一个非负整数 num,反复添加所有的数字,直到结果只有一个数字. 例如: 设定 num = 38,过程就像: 3 + 8 = 11, 1 + 1 = 2. 由于 2 只有1个数字,所以返 ...

  9. C#多线程编程实战1.6线程优先级

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  10. 「BZOJ 1876」「SDOI 2009」SuperGCD「数论」

    题意 求\(\gcd(a, b)\),其中\(a,b\leq10^{10000}\) 题解 使用\(\text{Stein}\)算法,其原理是不断筛除因子\(2\)然后使用更相减损法 如果不筛\(2\ ...