[转自] 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. integer encoding vs 1-hot (py)

    https://github.com/szilard/benchm-ml/issues/1 glouppe commented on 7 May 2015 Thanks for the benchma ...

  2. 498B Name That Tune

    传送门 题目大意 n首音乐,第i首被听出来的概率为pi,刚开始听第一首,1s后如果听出来了则放第下一首,否则接着听这一首,第i首在连续听了ti s之后一定会被听出来,问Ts后听出来的歌的期望数量. 分 ...

  3. Luogu 1580 [NOIP2016] 换教室

    先用Floyed做亮点之间的最短路,设计dp,记dp[i][j][0]为到第i节课,换了j次课,当前有没有换课达到的期望耗费体力最小值 方程(太长了还是看代码吧):dp[i][j][0]<-dp ...

  4. Terminologies in MVC: Part 2 (Razor Engine Syntax vs Web Form)

    By Abhishek Jaiswal :) on Mar 21, 2015 In this article we learn about Razor Engine Syntax vs Web For ...

  5. (转)MongoDB入门分享-笔记整理精选

    原文地址:http://www.cnblogs.com/Kummy/p/3372729.html 最近在学习MongoDB,怕以后忘记,自己做了一个整理,给不知道的小伙伴一起分享学习一下. 第一步&g ...

  6. Python&Django学习系列之-激活管理界面

    1.创建你个人的项目与APP 2.填写你的数据库名称与数据库类型,这里使用内置的sqllite3 3.修改setting文件 a.将'django.contrib.admin'加入setting的IN ...

  7. Jquery Call ,apply,callee

    //call function A() { name = "abc"; this.ShowName = function (val) { alert(name + ",& ...

  8. [.net 多线程]异步编程模式

    .NET中的异步编程 - EAP/APM 从.NET 4.5开始,支持的三种异步编程模式: 基于事件的异步编程设计模式 (EAP,Event-based Asynchronous Pattern) 异 ...

  9. c# as与is的区别

    在c#语言中关于类型的判断与转换有is和as这2种操作符,具体用法如下: is检查一个对象是否兼任与指定的类型,并返回一个Boolean值:true或false,主要,is操作符永远不会抛出异常,一下 ...

  10. 【大数据之数据仓库】GreenPlum PK DeepGreen(TPCH)

    1.背景 一张UML类图可以简单的说明GreenPlum和DeepGreen之间的关系: GreenPlum: 主页:http://greenplum.org/ 源码:开源,https://githu ...