package cn.itcast.dom4j;
import java.io.FileOutputStream;
import java.util.List;
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;
/**
* DOM4J的入门程序
* @author Administrator
*/
public class DOM4JTest {
public static void main(String[] args) {
try {
run3();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 测试XPATH的语言
* @throws Exception
*/
public static void run6() throws Exception{
SAXReader reader = new SAXReader();
Document document = reader.read("src/book2.xml");
// 原来:先获取根节点
// 现在:就不用,可以使用XPATH语言
// List<Node> authors = document.selectNodes("/书架/书/作者");
/*List<Node> authors = document.selectNodes("//简介");
for (Node node : authors) {
System.out.println(node.getText());
}*/
Node author = document.selectSingleNode("/书架/书[1]/作者");
System.out.println(author.getText());
}
/**
* 删除节点(删除第二本书下的最后猫的节点)
* @throws Exception
*/
public static void run5() throws Exception{
SAXReader reader = new SAXReader();
Document document = reader.read("src/book2.xml");
Element root = document.getRootElement();
// 第二本书
Element book2 = (Element) root.elements("书").get(1);
// 第二个猫
Element cat2 = (Element) book2.elements("猫").get(1);
// 使用书删除猫
book2.remove(cat2);
// 回写
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileOutputStream("src/book2.xml"), format);
writer.write(document);
writer.close();
}
/**
* 修改第一本书的作者标签的文本内容
* @throws Exception
*/
public static void run4() throws Exception{
/**
* 1.解析
* 2.先获取书架节点
* 3.再获取第一本书
* 4.再获取作者的节点
* 5.设置作者的节点的内容
* 6.回写
*/
SAXReader reader = new SAXReader();
Document document = reader.read("src/book2.xml");
Element root = document.getRootElement();
Element book1 = root.element("书");
// 获取作者的标签
Element author = book1.element("作者");
// 设置文本
author.setText("令狐冲");
// 回写
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileOutputStream("src/book2.xml"), format);
writer.write(document);
writer.close();
}
/**
* 需求:在指定的节点之前添加子节点
* 在第二本书的作者之前添加子节点
* @throws Exception
*/
public static void run3() throws Exception{
/**
* 1.先获取到第二本书下的所有的子节点
*/
// 解析
SAXReader reader = new SAXReader();
Document document = reader.read("src/book2.xml");
Element root = document.getRootElement();
// 获取第二本书
Element book2 = (Element) root.elements("书").get(1);
// 获取第二本书下所有的子节点
List<Element> list = book2.elements();
// 创建一个子节点
Element cat = DocumentHelper.createElement("猫");
cat.setText("我是猫");
// 向list集合中添加子节点
list.add(1, cat);
// 回写
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileOutputStream("src/book2.xml"), format);
writer.write(document);
writer.close();
}
/**
* 在第二本书下添加猫的节点
* @throws Exception
*/
public static void run2() throws Exception{
/**
* 1.解析
* 2.获取书架
* 3.获取第二本书
* 4.添加子节点
* 5.回写
*/
// 解析
SAXReader reader = new SAXReader();
Document document = reader.read("src/book2.xml");
// 获取根节点
Element root = document.getRootElement();
// 获取第二本书
Element book2 = (Element) root.elements("书").get(1);
// 直接在book2下去添加子节点
book2.addElement("猫").setText("我是猫");
// 设置漂亮的格式
OutputFormat format = OutputFormat.createPrettyPrint();
// OutputFormat format = OutputFormat.createCompactFormat();
// 回写
XMLWriter writer = new XMLWriter(new FileOutputStream("src/book2.xml"),format);
// 回写document对象
writer.write(document);
// 关闭流
writer.close();
}
/**
* 查找作者标签的文本内容
* @throws Exception
*/
public static void run1() throws Exception{
/**
* 1.创建解析器对象
* 2.解析XML文档,返回的是Document对象
* 3.获取根节点,获取书架的节点(是固定的)
* 4.注意:DOM4J是一层一层的获取节点的
* 5.通过根节点先获取书的节点
* 6.再通过书获取作者的节点
* 7.通过作者的节点获取文本的内容
*/
// 1.创建解析器对象
SAXReader reader = new SAXReader();
// 2.解析XML文档,返回的是Document对象
Document document = reader.read("src/book2.xml");
// 3.获取根节点,获取书架的节点(是固定的)
Element root = document.getRootElement();
// 4.注意:DOM4J是一层一层的获取节点的
List<Element> books = root.elements("书");
// 遍历
for(int i=0;i<books.size();i++){
Element book = books.get(i);
// 6.再通过书获取作者的节点
Element author = book.element("作者");
// 7.通过作者的节点获取文本的内容
System.out.println(author.getText());
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<书架>
<书>
<书名>葵花宝典</书名>
<作者>岳不群</作者>
<售价>998两</售价>
<简介>欲练此功...</简介>
</书>
<书>
<书名>降龙十八掌</书名>
<猫>我是猫</猫>
<作者 age="101">欧阳峰</作者>
<售价>9两</售价>
<简介>这书不错啊</简介>
<猫>我是猫</猫>
</书>
</书架>