[转自] 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. Claims Based Authentication and Token Based Authentication和WIF

    基于声明的认证方式,其最大特性是可传递(一方面是由授信的Issuer,即claims持有方,发送到你的应用上,注意信任是单向的.例如QQ集成登录,登录成功后,QQ会向你的应用发送claims.另一方面 ...

  2. vb.net 中 listview 中编辑 可以用 ComboBox 选择编辑数据

    Public Class ModifyLineData Dim mousePos As Point Dim pubListviewitem As ListViewItem Dim imgList As ...

  3. delphi xe6 for android 自带控件LocationSensor优先使用GPS定位的方法

    delphi xe6 for android LocationSensor控件默认是优先使用网络定位,对定位精度要求高的应用我们可以修改原码直接指定GPS定位. 修改方法: 将C:\Program F ...

  4. [转]-webkit-overflow-scrolling:touch的应用

    -webkit-overflow-scrolling 用来控制元素在移动设备上是否使用滚动回弹效果. 在移动端上,在你用overflow-y:scorll属性的时候,你会发现滚动的效果很木,很慢,这时 ...

  5. Activity和Fragment的生命周期

  6. C#多线程编程实战1.7前台线程和后台线程

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

  7. Castle Windsor

    让我们从Web API的集成点开始,它们是IDependencyResolver和IDependencyScope接口.IDependencyResolver和其他接口的名称可能与MVC中的接口相同, ...

  8. Android学习笔记AutoCompleteTextView的使用

    activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...

  9. kubernetes 1.3管中窥豹- RS(Replica Sets):the next-generation Replication Controller

    前言 kubernates 1.3出了几个新的概念,其中包括deployments,Replica Sets,并且官网称之为是the next-generation Replication Contr ...

  10. web.xml报错:cvc-complex-type.2.4.a: Invalid content was found starting with element 'async-supported'. One of '{"http://java.sun.com/xml/ns/javaee":init-param}' is expected.

    在写xml的时候又一次总是报cvc-complex-type.2.4.a: Invalid content was found starting with element 错误,还出现小红叉,在网上找 ...