1.要解析的xml文件book.xml
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="book1">
<title>JAVA编程思想</title>
<price>80.00</price>
</book>
<book id="book2">
<title>JAVA核心技术</title>
<price>100.00</price>
</book>
</books>
2.解析xml文件
package com.chen.dom; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.OutputStreamWriter; import java.util.Iterator; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.junit.Test; public class Dom4jTest { @Test public void read() throws Exception { SAXReader reader = new SAXReader(); Document document = reader.read(new File("resource/book.xml")); Element root = document.getRootElement(); Element book1 = (Element) root.elements("book").get(0); String id1 = book1.attributeValue("id"); String titleText = book1.element("title").getTextTrim(); System.out.println(id1 + "---" + titleText); } /* * 将整个xml使用递归完整输出 */ @Test public void readIterator() throws Exception { SAXReader reader = new SAXReader(); Document document = reader.read(new File("resource/book.xml")); Element root = document.getRootElement(); // 递归解析xml parse(root); } // 递归解析xml public void parse(Element element) { System.out.print("<" + element.getName()); // 遍历节点的属性 List<Attribute> attributes = element.attributes(); for (int i = 0; i < attributes.size(); i++) { Attribute attr = attributes.get(i); String name = attr.getName(); String value = attr.getValue(); System.out.print(" " + name + "=\"" + value + "\""); } System.out.println(">"); // 获取节点的文本信息 if (element.getTextTrim() != null && !"".equals(element.getTextTrim())) { System.out.println(element.getTextTrim()); } // 对该节点进行递归 for (Iterator i = element.elementIterator(); i.hasNext();) { parse((Element) i.next()); } System.out.println("</" + element.getName() + ">"); } @Test public void add() throws Exception { SAXReader reader = new SAXReader(); Document document = reader.read(new File("resource/book.xml")); Element root = document.getRootElement(); Element book1 = (Element) root.elements("book").get(1); Element authorElement = book1.addElement("author") .addAttribute("id", "author2").addText("张三"); OutputFormat format = OutputFormat.createPrettyPrint(); //从这里可以看出dom4j默认的编码方式为utf-8 System.out.println(format.getEncoding()); //设置编码格式防止乱码 <?xml version="1.0" encoding="gb2312"?> format.setEncoding("utf-8"); //使用FileWriter会乱码,因为使用了默认的gb2312编码输出,而dom4j使用的是默认的UTF-8编码 //如果format.setEncoding("gb2312"); 使用FileWriter就不会乱码 //XMLWriter writer = new XMLWriter(new FileWriter("resource/book.xml"),format); //使用FileOutputStream输出时指定编码 这个编码要和format.setEncoding("utf-8"); 一样 //XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream("resource/book.xml"), "utf-8"),format); //最简单的方法是设置format.setEncoding("utf-8");然后使用字节流输出 XMLWriter writer = new XMLWriter(new FileOutputStream("resource/book.xml"),format); writer.write(document); writer.close(); } //在指定位置上添加个新节点(改变list集合的顺序) @Test public void add2() throws Exception { SAXReader reader = new SAXReader(); Document document = reader.read(new File("resource/book.xml")); Element element = document.getRootElement().element("book"); List list = element.elements(); Element publishElement = DocumentHelper.createElement("publish"); publishElement.addText("机械工业出版社"); //改变list集合的顺序,就可以达到在指定位置添加新节点 list.add(1, publishElement); OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("utf-8"); XMLWriter writer = new XMLWriter(new FileOutputStream("resource/book.xml"),format); writer.write(document); writer.close(); } }
xml乱码的样子: