解析XML的方式有很多,本文介绍使用dom4j解析xml。

1、环境准备

(1)下载dom4j-1.6.1.jar

(2)下载junit-4.10.jar

2、温馨提示

解析XML过程是通过获取Document对象,然后继续获取各个节点以及属性等操作,因此获取Document对象是第一步,大体说来,有三种方式:

(1)自己创建Document对象

[java] view plaincopy print?
  1. Document document = DocumentHelper.createDocument();
  2. Element root = document.addElement("students");

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

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

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

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

[java] view plaincopy print?
  1. String xmlStr = "<students>......</students>";
  2. Document document = DocumentHelper.parseText(xmlStr);

3、示例

(1)xml文件内容如下

[html] view plaincopy print?
  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)解析过程

[java] view plaincopy print?
  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)解析结果

[html] view plaincopy print?
  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)代码示例

[java] view plaincopy print?
  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)结果

[html] view plaincopy print?
  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)代码

[java] view plaincopy print?
  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)结果

[html] view plaincopy print?
  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)代码

[java] view plaincopy print?
  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文件

[html] view plaincopy print?
  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()方法,输出内容是一行,没有进行格式化,是紧凑型的输出。如下:

[html] view plaincopy print?
  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 指南

    Java 使用 Dom4j 解析 XML 指南 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用 ...

  2. Java中DOM4J解析xml文件浅析

      DOM4J解析它是JDOM的一种智能分支.它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持.XML Schema支持以及用于大文档或流化文档的基于事件的处理.它还提供了构建文档表 ...

  3. Java利用dom4j解析XML任意节点和属性

    分享一个Java解析XML字符串的方法,利用了dom4j,递归.可解析任意节点及节点属性值. package test; import java.io.IOException; import java ...

  4. java使用DOM4j解析XML文件

    1.简介 dom4j是java中的XML API,性能优异.功能强大.开放源代码. 也是所有解析XML文件方法中最常用的! 2.代码实操 准备需要j的ar包添加到lib目录下,dom4j-2.1.1. ...

  5. java解析xml工具类_通过dom4j解析XML字符串XMLDocUtil工具类转换为XML文档及获取指定根节点及指定节点路径内容代码示例...

    一.前言 通过dom4j解析XML文档的XMLDocUtil工具类,进行解析xml字符串为Document文档对象.获取根节点元素路径内容getRootElement.获取唯一路径节点的值getSin ...

  6. Java - DOM4J解析XML文件

    文章目录 1. XML文档说明 2. XML解析 2.1 常见的解析方式 2.2 DOM4J解析xml 2.3 XPath表达式解析XML 3. 解析XML并封装到类中 4. 参考资料 1. XML文 ...

  7. dom4j java对象_dom4j解析XML成对象

    最近不太忙,发现现在服务之间的交互都是通过xml进行的,所以今天理了一下xml的两种解析方式.首先是最流行的dom4j解析.先解析,然后通过反射转成对象. 用到的jar:dom4j-1.6.1.jar ...

  8. java dom4j解析xml 对象_Java XML解析 - 利用DOM4j解析XML

    Java XML解析 - 利用DOM4j解析XML dom4j是一个简单的开源库,用于处理XML. XPath和XSLT,它基于Java平台,使用Java的集合框架,全面集成了DOM,SAX和JAXP ...

  9. java jdom dom4j_Java基础系列17:使用DOM、SAX、JDOM、DOM4J解析XML文件详解

    一 简介 在Java中,可以使用多种方式来解析XML文件,其中最常见的可能就是DOM.SAX.JDOM.DOM4J这四种方式了.其中,DOM和SAX这两种解析XML文件的方式有jdk自带的API,因此 ...

  10. java dom xml 换行,dom4j解析xml文件_用DOM解析XML文件,怎么才能让解析出来的文本不用换行_dom解析xml文件...

    网友求助:dom4j解析xml文件_用DOM解析XML文件,怎么才能让解析出来的文本不用换行_dom解析xml文件 问题importjava.text.SimpleDateFormat; import ...

最新文章

  1. ssh整合问题总结--使用struts2+Ajax+jquery验证用户名是否已被注册
  2. 功能到位 + 颜值爆表的开源任务管理工具
  3. IT软件开发 书籍汇总
  4. parted工具详解
  5. xshell连接突然报Connection closed by foreign host.
  6. 应用squid全面加速web(全)
  7. hibernate3连接mysql8报错_MySQL的8小时连接超时时间,导致系统过夜即崩溃,报错Could not roll back Hibernate transaction...
  8. SQLite与Sql Server的语法差异(转载)
  9. iPhone质量成迷?被吴彦祖一箭射穿,却还能开机
  10. Rxjs操作符决策树-思维导图
  11. ANDROID开发java.lang.NoClassDefFoundError: com.baidu.location.LocationClient的解决办法
  12. matlab dot函数
  13. 日期Date和String/Long之间的转换
  14. 什么软件可以查手机卡的imsi_怎么查看手机的IMSI?
  15. 黎明前的黑夜如此漫长
  16. PDF怎么编辑,如何裁剪PDF其中一页
  17. 免安装连接oracle,Oracle免安装PL/SQL连接
  18. amazeUI的icon图标库
  19. 安全牛3·15期间遭黑客攻击 阿里云成功抵御
  20. 牛客-kotori和糖果(哈斯图吗?)

热门文章

  1. Javascript当中的RSA加解密
  2. 装双系统?不需要!教你在iMac上流畅使用Windows!
  3. diy操作系统 0:万事开头难
  4. 今年的移动Pwn2own破解大赛:iPhone+安卓=50万美元
  5. Curl 方式实现POST提交数据
  6. java基础知识补漏(1)---内部类,重写、重载
  7. 「代码随想录」62.不同路径【动态规划】详解!
  8. 2021,前方路艰,与君共勉
  9. git 操作 中文文件名的时候,显示乱码 ,解决方法
  10. iOS 15 通知的新功能