1、使用Dom4j开发,需下载dom4j相应的jar文件
解压后,打开docs/guide.html>点击Quick start(快速入门),可以查看主要功能使用方法,快速了解Dom4J的使用
2、这里使用JUnit测试,需要导入Junit的Jar包,这个包在MyEclipse中自带有
<?xml version="1.0" encoding="UTF-8" standalone="no"?><书架> <书 ISBN="abc"> <书名>Java就业培训教程</书名> <作者>张孝详</作者> <批发价>8元</批发价> <售价>28.0元</售价> </书> <书 大小="猪肉"> <书名>JavaScript从入门到精通</书名> <作者>戴振良</作者> <售价>88.00元</售价> </书> </书架>
package com.itheima.dom4j; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.junit.Assert; import org.junit.Test; public class Dom4JCRUD { // 1、得到某个具体的节点内容 // 得到 第一本书的主体内容 @Test public void test1() throws Exception { SAXReader reader = new SAXReader();// 得到SAX解析器 Document document = reader.read("src/book.xml");// 得到DOM树 Element root = document.getRootElement();// 得到根元素 Element firstBook = root.element("书");// 得到第一个书元素 Assert.assertEquals("王昭珽", firstBook.elementText("作者")); } // 2、遍历所有元素节点 @Test public void test2() throws Exception { SAXReader reader = new SAXReader(); Document document = reader.read("src/book.xml"); Element root = document.getRootElement(); treeWalk(root); } public void treeWalk(Element e) { System.out.println(e.getName()); for (int i = 0, size = e.nodeCount(); i < size; i++) { Node n = e.node(i); if (n instanceof Element) { treeWalk((Element) n);// 递归 } } } // 3、修改某个元素节点的主体内容 // 修改第二本书的售价为55元 @Test public void test3() throws Exception { SAXReader reader = new SAXReader(); Document document = reader.read("src/book.xml"); Element root = document.getRootElement(); // 得到第2本书并修改主体内容 List<Element> list = root.elements(); Element secondBook = list.get(1); Element price = secondBook.element("售价"); price.setText("55.00元"); // 把DOM树写回XML文件 OutputStream out = new FileOutputStream("src/book.xml"); OutputFormat format = OutputFormat.createPrettyPrint();//创建美观的输出格式 XMLWriter writer = new XMLWriter(out, format); writer.write(document); //以format的格式将DOM树写到out中 } // 4、向指定元素节点中增加子元素节点 // 向第一本书增加<批发价>10.00元</批发价> @Test public void test4() throws Exception { SAXReader reader = new SAXReader(); Document document = reader.read("src/book.xml"); Element root = document.getRootElement(); // 1、得到第一本书 Element firstBook = root.element("书"); // 2、增加<批发价>10.00元</批发价> firstBook.addElement("批发价").setText("10.00元"); // 3、写回DOM树 OutputStream out = new FileOutputStream("src/book.xml"); OutputFormat format = OutputFormat.createPrettyPrint(); XMLWriter writer = new XMLWriter(out,format); writer.write(document); } // 5、向指定元素节点上增加同级元素节点 // 在第1本书的售价前插入<内部价>20.00元</内部价> @Test public void test5() throws Exception { SAXReader reader = new SAXReader(); Document document = reader.read("src/book.xml"); Element root = document.getRootElement(); // 1、获取第一本书的子元素的List Element firstBook = root.element("书"); List<Element> list = firstBook.elements(); // 2、创建一个元素<内部价>20.00元</内部价> Element innerPrice = DocumentHelper.createElement("内部价").addText("10.00元"); // 3、在List的索引1处插入一个<内部价>20.00元</内部价>元素 list.add(2, innerPrice); // 4、将DOM树写回XML文件 // 为什么List不用增加到DOM树中去呢,因为List保存的只是一个引用,这些引用 // 指向的是DOM树里的元素对象 OutputStream out = new FileOutputStream("src/book.xml"); OutputFormat format = OutputFormat.createPrettyPrint(); XMLWriter writer = new XMLWriter(out,format); writer.write(document); } // 6、删除指定元素节点 // 删除第1本书的批发价 @Test public void test06() throws Exception{ SAXReader reader = new SAXReader(); Document document = reader.read("src/book.xml"); Element root = document.getRootElement(); // 1、获取第一本书的售价元素 Element price = root.element("书").element("批发价"); // 2、用它的父元素把它移除 price.getParent().remove(price); // 3、将DOM树写回XML文件 OutputStream out = new FileOutputStream("src/book.xml"); OutputFormat format = OutputFormat.createPrettyPrint(); XMLWriter writer = new XMLWriter(out,format); writer.write(document); } // 7、操作XML文件属性 // 获取第一本书的ISBN属性值 @Test public void test07() throws Exception{ SAXReader reader = new SAXReader(); Document document = reader.read("src/book.xml"); Element root = document.getRootElement(); // 1、获取第一本书 Element book = root.element("书"); // 2、获取它的ISBN属性值 String ISBN = book.attributeValue("ISBN"); Assert.assertEquals("abc", ISBN); } // 8、增加XML文件属性 // 为第一本书的增加出版社属性:出版社="小马出版社" @Test public void test08() throws Exception{ SAXReader reader = new SAXReader(); Document document = reader.read("src/book.xml"); Element root = document.getRootElement(); // 1、获取第一本书 Element book = root.element("书"); // 2、增加出版社属性 book.addAttribute("出版社", "小马出版社"); // 3、将DOM树写回XML文档 OutputStream out = new FileOutputStream("src/book.xml"); OutputFormat format = OutputFormat.createPrettyPrint(); XMLWriter writer = new XMLWriter(out,format); writer.write(document); } }
XPath
在使用XPath时,除了需要导入Dom4J包里的dom4j-1.6.1.jar包还需要改Dom4J中lib目录下的jaxen-1.1-beta-6.jar包
Lib目录中的包是按需导入的。
查看XPath的帮助文档,有中文的,非常容易理解的。
想要对某个元素进行操作都必须得先得到该元素,上面例子中得到某个元素需要根据DOM树结构一层一层的去获取,很麻烦,通过XPath就能快速的得到想要的元素,DOM4J中支持XPath的方法有3个,如下:
List list = document.selectNodes( "//foo/bar" );//获取多个节点 Node node = document.selectSingleNode( "//foo/bar/author" );//获取单个节点 String name = node.valueOf( "@name" );//获取属性值如上面例子中第text1可改为:
// 1、得到某个具体的节点内容 // 得到 第一本书的主体内容 @Test public void test11() throws Exception { SAXReader reader = new SAXReader();// 得到SAX解析器 Document document = reader.read("src/book.xml");// 得到DOM树 String xpath = "//书[1]/作者"; Node author = document.selectSingleNode(xpath); Assert.assertEquals("王昭珽", author.getText()); }
如上面例子中第text7可改为:
// 7、操作XML文件属性 // 获取第一本书的ISBN属性值 @Test public void test071() throws Exception{ SAXReader reader = new SAXReader(); Document document = reader.read("src/book.xml"); Element root = document.getRootElement(); String xpath = "//书[1]"; Node firstBook = document.selectSingleNode(xpath); xpath = "@ISBN"; String ISBNValue = firstBook.valueOf(xpath); Assert.assertEquals("abc", ISBNValue); }
选择所有属性为:ISBN="abc" 出版社="小马出版社" 的<书>元素
@Test public void test9() throws Exception{ SAXReader reader = new SAXReader(); Document document = reader.read("src/book.xml"); Element root = document.getRootElement(); String xpath = "//书[@ISBN='abc' and @出版社='小马出版社']"; Node book = document.selectSingleNode(xpath); Assert.assertEquals("书", book.getName()); }