1.要解析的xml文件book.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <books>
  3. <book id="book1">
  4. <title>JAVA编程思想</title>
  5. <price>80.00</price>
  6. </book>
  7. <book id="book2">
  8. <title>JAVA核心技术</title>
  9. <price>100.00</price>
  10. </book>
  11. </books>

2.解析xml文件

  1. package com.chen.dom;
  2.  
  3. import java.io.File;
  4. import java.io.FileOutputStream;
  5. import java.io.FileWriter;
  6. import java.io.OutputStreamWriter;
  7. import java.util.Iterator;
  8. import java.util.List;
  9.  
  10. import org.dom4j.Attribute;
  11. import org.dom4j.Document;
  12. import org.dom4j.DocumentHelper;
  13. import org.dom4j.Element;
  14. import org.dom4j.io.OutputFormat;
  15. import org.dom4j.io.SAXReader;
  16. import org.dom4j.io.XMLWriter;
  17. import org.junit.Test;
  18.  
  19. public class Dom4jTest {
  20. @Test
  21. public void read() throws Exception {
  22. SAXReader reader = new SAXReader();
  23. Document document = reader.read(new File("resource/book.xml"));
  24. Element root = document.getRootElement();
  25. Element book1 = (Element) root.elements("book").get(0);
  26. String id1 = book1.attributeValue("id");
  27. String titleText = book1.element("title").getTextTrim();
  28. System.out.println(id1 + "---" + titleText);
  29. }
  30.  
  31. /*
  32. * 将整个xml使用递归完整输出
  33. */
  34. @Test
  35. public void readIterator() throws Exception {
  36. SAXReader reader = new SAXReader();
  37. Document document = reader.read(new File("resource/book.xml"));
  38. Element root = document.getRootElement();
  39. // 递归解析xml
  40. parse(root);
  41.  
  42. }
  43.  
  44. // 递归解析xml
  45. public void parse(Element element) {
  46. System.out.print("<" + element.getName());
  47. // 遍历节点的属性
  48. List<Attribute> attributes = element.attributes();
  49. for (int i = 0; i < attributes.size(); i++) {
  50. Attribute attr = attributes.get(i);
  51. String name = attr.getName();
  52. String value = attr.getValue();
  53. System.out.print(" " + name + "=\"" + value + "\"");
  54. }
  55. System.out.println(">");
  56. // 获取节点的文本信息
  57. if (element.getTextTrim() != null && !"".equals(element.getTextTrim())) {
  58. System.out.println(element.getTextTrim());
  59. }
  60. // 对该节点进行递归
  61. for (Iterator i = element.elementIterator(); i.hasNext();) {
  62. parse((Element) i.next());
  63. }
  64. System.out.println("</" + element.getName() + ">");
  65. }
  66.  
  67. @Test
  68. public void add() throws Exception {
  69. SAXReader reader = new SAXReader();
  70. Document document = reader.read(new File("resource/book.xml"));
  71. Element root = document.getRootElement();
  72. Element book1 = (Element) root.elements("book").get(1);
  73. Element authorElement = book1.addElement("author")
  74. .addAttribute("id", "author2").addText("张三");
  75.  
  76. OutputFormat format = OutputFormat.createPrettyPrint();
  77. //从这里可以看出dom4j默认的编码方式为utf-8
  78. System.out.println(format.getEncoding());
  79. //设置编码格式防止乱码 <?xml version="1.0" encoding="gb2312"?>
  80. format.setEncoding("utf-8");
  81.  
  82. //使用FileWriter会乱码,因为使用了默认的gb2312编码输出,而dom4j使用的是默认的UTF-8编码
  83. //如果format.setEncoding("gb2312"); 使用FileWriter就不会乱码
  84. //XMLWriter writer = new XMLWriter(new FileWriter("resource/book.xml"),format);
  85.  
  86. //使用FileOutputStream输出时指定编码 这个编码要和format.setEncoding("utf-8"); 一样
  87. //XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream("resource/book.xml"), "utf-8"),format);
  88. //最简单的方法是设置format.setEncoding("utf-8");然后使用字节流输出
  89. XMLWriter writer = new XMLWriter(new FileOutputStream("resource/book.xml"),format);
  90.  
  91. writer.write(document);
  92. writer.close();
  93. }
  94.  
  95. //在指定位置上添加个新节点(改变list集合的顺序)
  96. @Test
  97. public void add2() throws Exception {
  98. SAXReader reader = new SAXReader();
  99. Document document = reader.read(new File("resource/book.xml"));
  100. Element element = document.getRootElement().element("book");
  101. List list = element.elements();
  102. Element publishElement = DocumentHelper.createElement("publish");
  103. publishElement.addText("机械工业出版社");
  104. //改变list集合的顺序,就可以达到在指定位置添加新节点
  105. list.add(1, publishElement);
  106.  
  107. OutputFormat format = OutputFormat.createPrettyPrint();
  108. format.setEncoding("utf-8");
  109.  
  110. XMLWriter writer = new XMLWriter(new FileOutputStream("resource/book.xml"),format);
  111. writer.write(document);
  112. writer.close();
  113. }
  114. }

xml乱码的样子:

dom4j的小例子的更多相关文章

  1. java操作xml的一个小例子

    最近两天公司事比较多,这两天自己主要跟xml打交道,今天更一下用java操作xml的一个小例子. 原来自己操作xml一直用这个包:xstream-1.4.2.jar.然后用注解的方式,很方便,自己只要 ...

  2. Spring和Hibernate结合的一个小例子

    1.新建一个SpringHibernate的maven项目 2.pom文件的依赖为 <dependency> <groupId>junit</groupId> &l ...

  3. dom4j的测试例子和源码详解(重点对比和DOM、SAX的区别)

    目录 简介 DOM.SAX.JAXP和DOM4J xerces解释器 SAX DOM JAXP DOM解析器 获取SAX解析器 DOM4j 项目环境 工程环境 创建项目 引入依赖 使用例子--生成xm ...

  4. springmvc入门的第一个小例子

    今天我们探讨一下springmvc,由于是初学,所以简单的了解一下 springmvc的流程,后续会持续更新... 由一个小例子来简单的了解一下 springmvc springmvc是spring框 ...

  5. java即时通信小例子

    学习java一段时间了,今天写来一个即时通信的小例子练手在其过程中也学到了一些知识拿出来和大家分享,请路过的各位大神多多赐教... 好了下面讲一下基本的思路: 首先,编写服务器端的程序,简单点说吧就是 ...

  6. Runtime的几个小例子(含Demo)

    一.什么是runtime(也就是所谓的“运行时”,因为是在运行时实现的.)           1.runtime是一套底层的c语言API(包括很多强大实用的c语言类型,c语言函数);  [runti ...

  7. bootstrap 模态 modal 小例子

    bootstrap 模态 modal  小例子 <html> <head> <meta charset="utf-8" /> <title ...

  8. INI配置文件分析小例子

    随手写个解析INI配置字符串的小例子 带测试 #include <iostream> #include <map> #include <string> #inclu ...

  9. JavaScript小例子:复选框全选

    JavaScript小例子:复选框全选 这只是一个小例子,很简单,但是这个功能还是很常用的: 实现后效果如图: JavaScript代码: <script type="text/jav ...

随机推荐

  1. 《Ansible权威指南》笔记(1)——安装,ssh密钥登陆,命令

    2016-12-23 读这本<Ansible权威指南>学习ansible,根据本书内容和网上的各种文档,以及经过自己测试,写出以下笔记.另,这本书内容很好,但印刷错误比较多,作者说第二版会 ...

  2. 第9章 Shell基础(2)_Bash基本功能

    3. Bash的基本功能 3.1 历史命令与命令补全 (1)历史命令:#history [选项] [历史命令保存文件] ①选项:-c:清空历史命令: -w:把缓存中的历史命令写入文件~/.bash_h ...

  3. EL表达式

    跳转传到: : 相当于(接值放值): --------------------------- --------------------------------- ------------------- ...

  4. [LeetCode] Binary Tree Preorder Traversal 二叉树的先序遍历

    Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binary tr ...

  5. [LeetCode] Two Sum 两数之和

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  6. 使用Minicom基于串口调试HiKey

    虽然通过adb shell调试方便,但是有些时候不得不借助于串口进行调试,比如测试suspend to ram之类的功能时,adb服务被关闭. 同时在minicom中也可以进入shell,进行操作. ...

  7. c++局域网多播

    转自http://www.51cto.com/specbook/17/35216.htm Visual C++实现局域网IP多播 在局域网中,管理员常常需要将某条信息发送给一组用户.如果使用一对一的发 ...

  8. Google C++命名规范

    时间:2014.03.02 地点:基地 -------------------------------------------------------------------------------- ...

  9. 让PDF.NET支持最新的SQLite数据库

    最近项目中用到了SQLite,之前项目中用的是PDF.NET+MySQL的组合,已经写了不少代码,如果能把写好的代码直接用在SQLite上就好了,PDF.NET支持大部分主流的数据库,这个当然可以,只 ...

  10. 在Arcscene绘制管线三维横断面(AE绘制三维点阵文字)

    根据数据信息动态生成三维管线及横断面表格.效果图如下: 在获取信息后,直接构造点阵进行文字绘制即可. 绘制IElement代码: /// <summary> /// 绘制三维文字 /// ...