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());
}