DOM4J 进行XML解析
例子: 利用DOM4J开发包对如下的XML进行解析
<?xml version="1.0" encoding="UTF-8"?>
<书架>
<书>
<书名>JAVA</书名>
<作者>毕向东</作者>
<售价>38</售价>
</书>
<书>
<书名>JAVAWEB</书名>
<作者>马士兵</作者>
<售价>60.00</售价>
</书>
</书架>
*******************************************************************************************************************
解析:
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.List;
import junit.framework.Assert;
import org.dom4j.Document;
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.Test;
public class Dom4JDemo {
// 1. 得到某个具体的节点内容: 第2本书的作者
@Test
public void test1() throws Exception {
// 创建SAXReader读取器,并得到Document对象
SAXReader reader = new SAXReader();
Document document = reader.read("src/book.xml");
// 得到根元素
Element root = document.getRootElement();
// 依次得到第2本书的作者
List<Element> es = root.elements("书");
Element e = es.get(1);
Element author = e.element("作者");
// 拿到内容并打印输出
//System.out.println(author.getText());
// 使用断言的方式来校验
Assert.assertEquals("马士兵", author.getText());
}
// 11. Xpath方式得到某个具体的节点内容: 第2本书的作者
@Test
public void test11() throws Exception{
SAXReader reader = new SAXReader();
Document document = reader.read("src/book.xml");
String xpath = "//书[2]/作者";
Node author = document.selectSingleNode(xpath);
Assert.assertEquals("马士兵", author.getText());
}
// 2. 遍历所有元素节点
@Test
public void test2() throws Exception {
// 创建SAXReader读取器,并设置Document对象
SAXReader reader = new SAXReader();
Document document = reader.read("src/book.xml");
// 得到根元素
Element root = document.getRootElement();
// 遍历所有的元素,打印它的名称
treeWalk1(root);
}
// 遍历所有元素,打印他的名称 法1:此法简单 选此法
public void treeWalk1(Element root) {
System.out.println(root.getName());
List<Element> es = root.elements();
for (Element e : es) {
treeWalk1(e);
}
}
// 遍历所有元素,打印他的名称 法2:
public void treeWalk2(Element root) {
System.out.println(root.getName());
// 节点的数量
int count = root.nodeCount();
for (int i = 0; i < count; i++) {
// 取索引上的节点
Node node = root.node(i);
// if(node.getNodeType() == Node.ELEMENT_NODE){
if (node instanceof Element) {
treeWalk2((Element) node);
}
}
}
// 3. 修改某个元素节点的内容: 修改第2本书的售价
@Test
public void test3() throws Exception {
// 创建SAXReader读取器,并设置Document对象
SAXReader reader = new SAXReader();
Document document = reader.read("src/book.xml");
// 得到根元素
Element root = document.getRootElement();
// 得到第2本书的售价
Element secondBook = (Element) root.elements().get(1);
Element secondBookPrice = secondBook.element("售价");
// 设置主体内容
secondBookPrice.setText("60.00");
// 写回XML文档,分别创建目的地和格式
OutputStream out = new FileOutputStream("src/book.xml");
OutputFormat format = OutputFormat.createPrettyPrint();
// 指定编码: 默认编码为UTF-8
// format.setEncoding("UTF-8");
// 创建写出器:第一个参数为 目的XML文档,第二个参数是 指定的写入格式
XMLWriter writer = new XMLWriter(out, format);
// 将文档作为源写出
writer.write(document);
writer.close();
}
// 4. 向指定元素节点中增加子元素节点: 给第1本书添加批发价
@Test
public void test4() throws Exception {
// 创建SAXReader读取器,并设置Document对象
SAXReader reader = new SAXReader();
Document document = reader.read("src/book.xml");
// 得到根元素
Element root = (Element) document.getRootElement();
// 找到第1本书,直接添加新元素
Element firstBook = root.element("书");
firstBook.addElement("批发价").setText("50");
// 写回XML文档 分别设置目的地和格式
OutputStream out = new FileOutputStream("src/book.xml");
OutputFormat format = OutputFormat.createPrettyPrint();
// 指定编码,默认为UTF-8编码
format.setEncoding("UTF-8");
// 创建写出器XMLWriter:第一个参数为 目的XML文档,第二个参数是 指定的写入格式
XMLWriter writer = new XMLWriter(out, format);
// 将文档作为源写出
writer.write(document);
writer.close();
}
// 5. 向指定元素节点上增加同级元素节点: 在第1本书的售价前面添加内部价
@Test
public void test5() throws Exception {
// 创建SAXReader读取器,并设置Document对象
SAXReader reader = new SAXReader();
Document document = reader.read("src/book.xml");
// 得到根元素
Element root = document.getRootElement();
// 找到第1本书
Element firstBook = root.element("书");
// 得到第1本书的所有子元素:List
List<Element> childrenlt = firstBook.elements();
// 借助DocumentHelper创建内部价元素,并设置其主体内容
Element price = DocumentHelper.createElement("内部价");
price.setText("10.00");
// 挂接到老3的位置
childrenlt.add(2, price);
// 写回XML文档,分别设置目的地和格式
OutputStream out = new FileOutputStream("src/book.xml");
OutputFormat format = OutputFormat.createPrettyPrint();
// 指定编码,默认为UTF-8编码
format.setEncoding("UTF-8");
// 创建写出器XMLWriter,第一个参数为 目的XML文档,第二个参数为 写出的格式
XMLWriter writer = new XMLWriter(out, format);
// 将文档作为源写出
writer.write(document);
writer.close();
}
// 6. 删除指定元素节点: 删除批发价
@Test
public void test6() throws Exception {
// 创建SAXReader读取器,并设置Document对象
SAXReader reader = new SAXReader();
Document document = reader.read("src/book.xml");
// 得到根元素
Element root = document.getRootElement();
// 得到第1本书
Element firstBook = root.element("书");
// 由第1本书删除批发价元素
Element price = firstBook.element("批发价");
firstBook.remove(price);
// 写回XML文档:分别设置目的地和格式
OutputStream out = new FileOutputStream("src/book.xml");
OutputFormat format = OutputFormat.createPrettyPrint();
// 指定编码,默认为UTF-8编码
format.setEncoding("UTF-8");
// 创建写出器XMLWriter: 第一个参数为 目的XML文档,第2个参数为 写出的格式
XMLWriter writer = new XMLWriter(out, format);
// 将文档作为源写出
writer.write(document);
writer.close();
}
// 7. 操作XML文件属性:给第1本书添加一个出版社属性
@Test
public void test7() throws Exception {
// 创建SAXReader读取器,并设置Document对象
SAXReader reader = new SAXReader();
Document document = reader.read("src/book.xml");
// 得到根元素
Element root = document.getRootElement();
// 得到第1本书
Element firstBook = root.element("书");
// 添加属性
firstBook.addAttribute("出版社", "传智播客");
// 写回XML文档: 分别设置目的地和格式
OutputStream out = new FileOutputStream("src/book.xml");
OutputFormat format = OutputFormat.createPrettyPrint();
// 指定编码,默认为UTF-8编码
format.setEncoding("UTF-8");
// 创建写出器XMLWriter: 第一个参数为 目的XML文档, 第2个参数为 写出格式
XMLWriter writer = new XMLWriter(out, format);
// 将文档作为源写出
writer.write(document);
writer.close();
}
// 8. 获取第一本书的出版社属性
@Test
public void test8() throws Exception {
// 创建SAXReader读取器,并设置Document对象
SAXReader reader = new SAXReader();
Document document = reader.read("src/book.xml");
// 得到根元素
Element root = document.getRootElement();
// 得到第1本书,并获取其出版社属性的主体内容
Element firstBook = root.element("书");
String value = firstBook.attributeValue("出版社");
// 使用断言,校验出版社主体内容
Assert.assertEquals("传智播客", value);
}
}
需要的jar包:
dom4j-1.6.1.zip中的dom4j-1.6.1.jar
jaxen-1.1-beta-6.jar
Xpath参考手册
例子: 利用DOM4J开发包对如下的XML进行解析
<?xml version="1.0" encoding="UTF-8"?>
<书架>
<书>
<书名>JAVA</书名>
<作者>毕向东</作者>
<售价>38</售价>
</书>
<书>
<书名>JAVAWEB</书名>
<作者>马士兵</作者>
<售价>60.00</售价>
</书>
</书架>
*******************************************************************************************************************
解析:
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.List;
import junit.framework.Assert;
import org.dom4j.Document;
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.Test;
public class Dom4JDemo {
// 1. 得到某个具体的节点内容: 第2本书的作者
@Test
public void test1() throws Exception {
// 创建SAXReader读取器,并得到Document对象
SAXReader reader = new SAXReader();
Document document = reader.read("src/book.xml");
// 得到根元素
Element root = document.getRootElement();
// 依次得到第2本书的作者
List<Element> es = root.elements("书");
Element e = es.get(1);
Element author = e.element("作者");
// 拿到内容并打印输出
//System.out.println(author.getText());
// 使用断言的方式来校验
Assert.assertEquals("马士兵", author.getText());
}
// 11. Xpath方式得到某个具体的节点内容: 第2本书的作者
@Test
public void test11() throws Exception{
SAXReader reader = new SAXReader();
Document document = reader.read("src/book.xml");
String xpath = "//书[2]/作者";
Node author = document.selectSingleNode(xpath);
Assert.assertEquals("马士兵", author.getText());
}
// 2. 遍历所有元素节点
@Test
public void test2() throws Exception {
// 创建SAXReader读取器,并设置Document对象
SAXReader reader = new SAXReader();
Document document = reader.read("src/book.xml");
// 得到根元素
Element root = document.getRootElement();
// 遍历所有的元素,打印它的名称
treeWalk1(root);
}
// 遍历所有元素,打印他的名称 法1:此法简单 选此法
public void treeWalk1(Element root) {
System.out.println(root.getName());
List<Element> es = root.elements();
for (Element e : es) {
treeWalk1(e);
}
}
// 遍历所有元素,打印他的名称 法2:
public void treeWalk2(Element root) {
System.out.println(root.getName());
// 节点的数量
int count = root.nodeCount();
for (int i = 0; i < count; i++) {
// 取索引上的节点
Node node = root.node(i);
// if(node.getNodeType() == Node.ELEMENT_NODE){
if (node instanceof Element) {
treeWalk2((Element) node);
}
}
}
// 3. 修改某个元素节点的内容: 修改第2本书的售价
@Test
public void test3() throws Exception {
// 创建SAXReader读取器,并设置Document对象
SAXReader reader = new SAXReader();
Document document = reader.read("src/book.xml");
// 得到根元素
Element root = document.getRootElement();
// 得到第2本书的售价
Element secondBook = (Element) root.elements().get(1);
Element secondBookPrice = secondBook.element("售价");
// 设置主体内容
secondBookPrice.setText("60.00");
// 写回XML文档,分别创建目的地和格式
OutputStream out = new FileOutputStream("src/book.xml");
OutputFormat format = OutputFormat.createPrettyPrint();
// 指定编码: 默认编码为UTF-8
// format.setEncoding("UTF-8");
// 创建写出器:第一个参数为 目的XML文档,第二个参数是 指定的写入格式
XMLWriter writer = new XMLWriter(out, format);
// 将文档作为源写出
writer.write(document);
writer.close();
}
// 4. 向指定元素节点中增加子元素节点: 给第1本书添加批发价
@Test
public void test4() throws Exception {
// 创建SAXReader读取器,并设置Document对象
SAXReader reader = new SAXReader();
Document document = reader.read("src/book.xml");
// 得到根元素
Element root = (Element) document.getRootElement();
// 找到第1本书,直接添加新元素
Element firstBook = root.element("书");
firstBook.addElement("批发价").setText("50");
// 写回XML文档 分别设置目的地和格式
OutputStream out = new FileOutputStream("src/book.xml");
OutputFormat format = OutputFormat.createPrettyPrint();
// 指定编码,默认为UTF-8编码
format.setEncoding("UTF-8");
// 创建写出器XMLWriter:第一个参数为 目的XML文档,第二个参数是 指定的写入格式
XMLWriter writer = new XMLWriter(out, format);
// 将文档作为源写出
writer.write(document);
writer.close();
}
// 5. 向指定元素节点上增加同级元素节点: 在第1本书的售价前面添加内部价
@Test
public void test5() throws Exception {
// 创建SAXReader读取器,并设置Document对象
SAXReader reader = new SAXReader();
Document document = reader.read("src/book.xml");
// 得到根元素
Element root = document.getRootElement();
// 找到第1本书
Element firstBook = root.element("书");
// 得到第1本书的所有子元素:List
List<Element> childrenlt = firstBook.elements();
// 借助DocumentHelper创建内部价元素,并设置其主体内容
Element price = DocumentHelper.createElement("内部价");
price.setText("10.00");
// 挂接到老3的位置
childrenlt.add(2, price);
// 写回XML文档,分别设置目的地和格式
OutputStream out = new FileOutputStream("src/book.xml");
OutputFormat format = OutputFormat.createPrettyPrint();
// 指定编码,默认为UTF-8编码
format.setEncoding("UTF-8");
// 创建写出器XMLWriter,第一个参数为 目的XML文档,第二个参数为 写出的格式
XMLWriter writer = new XMLWriter(out, format);
// 将文档作为源写出
writer.write(document);
writer.close();
}
// 6. 删除指定元素节点: 删除批发价
@Test
public void test6() throws Exception {
// 创建SAXReader读取器,并设置Document对象
SAXReader reader = new SAXReader();
Document document = reader.read("src/book.xml");
// 得到根元素
Element root = document.getRootElement();
// 得到第1本书
Element firstBook = root.element("书");
// 由第1本书删除批发价元素
Element price = firstBook.element("批发价");
firstBook.remove(price);
// 写回XML文档:分别设置目的地和格式
OutputStream out = new FileOutputStream("src/book.xml");
OutputFormat format = OutputFormat.createPrettyPrint();
// 指定编码,默认为UTF-8编码
format.setEncoding("UTF-8");
// 创建写出器XMLWriter: 第一个参数为 目的XML文档,第2个参数为 写出的格式
XMLWriter writer = new XMLWriter(out, format);
// 将文档作为源写出
writer.write(document);
writer.close();
}
// 7. 操作XML文件属性:给第1本书添加一个出版社属性
@Test
public void test7() throws Exception {
// 创建SAXReader读取器,并设置Document对象
SAXReader reader = new SAXReader();
Document document = reader.read("src/book.xml");
// 得到根元素
Element root = document.getRootElement();
// 得到第1本书
Element firstBook = root.element("书");
// 添加属性
firstBook.addAttribute("出版社", "传智播客");
// 写回XML文档: 分别设置目的地和格式
OutputStream out = new FileOutputStream("src/book.xml");
OutputFormat format = OutputFormat.createPrettyPrint();
// 指定编码,默认为UTF-8编码
format.setEncoding("UTF-8");
// 创建写出器XMLWriter: 第一个参数为 目的XML文档, 第2个参数为 写出格式
XMLWriter writer = new XMLWriter(out, format);
// 将文档作为源写出
writer.write(document);
writer.close();
}
// 8. 获取第一本书的出版社属性
@Test
public void test8() throws Exception {
// 创建SAXReader读取器,并设置Document对象
SAXReader reader = new SAXReader();
Document document = reader.read("src/book.xml");
// 得到根元素
Element root = document.getRootElement();
// 得到第1本书,并获取其出版社属性的主体内容
Element firstBook = root.element("书");
String value = firstBook.attributeValue("出版社");
// 使用断言,校验出版社主体内容
Assert.assertEquals("传智播客", value);
}
}