package cn.itheima.dom4j;
import java.io.File;
import java.io.FileWriter;
import java.util.*;
import org.dom4j.*;
import org.junit.Test;
import cn.heima.ben.Book;
public class Demo1
{
/**
* 查找元素
*
* @throws Exception
*/
public void find() throws Exception
{
// 1. 获取解析器
SAXReader reader = new SAXReader();
// 2. 解析xml文件
Document dom = reader.read("book.xml");
// 3. 获取根节点
Element root = dom.getRootElement();
List<Element> list = root.elements();
Book b = null;
List<Book> listBook = new ArrayList<Book>();
for (Element e : list)
{
b = new Book();
String publish = e.attribute("出版社").getValue();
String bookid = e.attribute("书号").getValue();
b.setPublish(publish);
b.setBookid(bookid);
List<Element> listInfor = e.elements();
b.setName(listInfor.get(0).getTextTrim());
b.setAuthor(listInfor.get(1).getTextTrim());
b.setPrice(listInfor.get(2).getTextTrim());
System.out.println(b);
listBook.add(b);
b = null;
}
}
/**
* 增加元素
*/
@SuppressWarnings("deprecation")
public void add() throws Exception
{
Book book = new Book("网络安全攻与防", "天网", "200", "清华大学出版社", "324434");
// 1. 获取解析器
SAXReader reader = new SAXReader();
// 2. 解析xml文件
File file = new File("book.xml");
Document dom = reader.read(file);
// 2. 获取xml文件的根节点
Element root = dom.getRootElement();
/* 3. 创建 书 这个新节点 */
// 创建书节点
Element newbook = DocumentHelper.createElement("书");
// 为书记节点设置两个属性
newbook.setAttributeValue("出版社", book.getPublish());
newbook.setAttributeValue("书号", book.getBookid());
// 创建三个节点,并为其设置数据
Element bookName = DocumentHelper.createElement("书名");
bookName.setText(book.getName());
Element bookAuthor = DocumentHelper.createElement("作者");
bookAuthor.setText(book.getAuthor());
Element bookPrice = DocumentHelper.createElement("售价");
bookPrice.setText(book.getPrice());
// 将创建号的 书名/作者/售价三个节点挂在到newbook这个节点上
newbook.add(bookName);
newbook.add(bookAuthor);
newbook.add(bookPrice);
// 将newBook这个创建的节点挂载到root这个跟节点上
root.add(newbook);
// 4. 跟新数据
// 更新的第一种方式
/*
* FileWriter writer = new FileWriter(file);
*
* dom.write(writer);
*
* writer.close();
*/
// 更新的第二种方式,此方式可以格式化xml文件中的数据格式
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("gb2312");
XMLWriter xmlWriter = new XMLWriter(new FileWriter(file), format);
xmlWriter.write(dom);
xmlWriter.close();
}
/**
* 删除节点
* 删除书名为 网络安全攻与防 的书的节点
*/
public void delet() throws Exception
{
Book book = new Book("网络安全攻与防", "天网", "200", "清华大学出版社", "324434");
// 1. 获取解析器
SAXReader reader = new SAXReader();
// 2. 解析xml文件
File file = new File("book.xml");
Document dom = reader.read(file);
// 2. 获取xml文件的根节点
Element root = dom.getRootElement();
// 获取所有的书节点
List<Element> list = root.elements();
//3. 遍历所有的书节点
for (Element e : list)
{
// 获取书节点中 <书名> 这个节点中的书名
String name = e.element("书名").getTextTrim();
//如果书名为 “网络安全攻与防” 这删除这个节点的夫节点点书
if ("网络安全攻与防".equals(name))
//4. 删除节点
root.remove(e);
}
/**
* 5. 更新数据
* 获取格式对象
*/
OutputFormat format = OutputFormat.createPrettyPrint();
// 设置格式的编码
format.setEncoding("gb2312");
// 按照上面的格式将dom写入到file输出流中
XMLWriter xmlWriter = new XMLWriter(new FileWriter(file), format);
//将dom节点输出
xmlWriter.write(dom);
//关闭流
xmlWriter.close();
}
/**
* XPath 解析xml文件
* XPath解析需要dom4j-1.6.1.jar和 jaxen-1.1-beta-6.jar两个jar文件的支持
* 在此方式解析中字符
*
*/
// / 单斜杠表示一个级别就像window操作系统中的路径一样
// // 双斜杠 表示在文档中的任意一个位置进行查找 例如: //书名 表示整个文档中标签名为书名的节点的集合
// //@出版社 双斜杠@属性名表示在文档中含有属性出版社的所有节点的集合
// //@出版社[i] 中括号表示集合中的第i个元素,此表达式表示为 文档中含有属性出版社的第一个节点
// //@出版社[last()] 表示整个集合中的最后一个元素
// * *号表示所有的,例如:/书架/@出版社/* 表示书架下面含有出版社属性的节点。该节点下的所有的节点元素
// //BBB[@name] 表示所有标签为BBB的字节并且含有属性name的所有的节点
// //BBB[not(@*)] 表示所有标签为BBB并且不好任何属性的节点的集合
/**
* 例如:/书架/书/书名 此解析式意思为在书架标签下的书下的标签名为书名的这个标签
*
*/
@Test
public void test()throws Exception
{
//1.获取解析器
SAXReader reader = new SAXReader();
//2.解析xml
Document dom = reader.read(new File("book.xml"));
//获取整个文档中以书为标签的节点的集合
List<Element> booklist2 = dom.selectNodes("//@出版社");
System.out.println(booklist2.size());
}
@SuppressWarnings("unchecked")
public void xPath1()throws Exception
{
//1.获取解析器
SAXReader reader = new SAXReader();
//2.解析xml
Document dom = reader.read(new File("book.xml"));
//获取整个文档中以书为标签的节点的集合
List<Element> booklist2 = dom.selectNodes("/书架/书");
Book book = null;
//定义一个集合用来存放从book.xnl中读取来的数据封装成book对象
List<Book> bookList = new ArrayList<Book>();
for(Element e : booklist2)
{
// 获取书节点上的两个属性 出版社 和书号
String publish = e.attributeValue("出版社");
String bookid = e.attributeValue("书号");
List<Element> bookInfo = e.elements();
String name = bookInfo.get(0).getTextTrim();
String author = bookInfo.get(0).getTextTrim();
String price = bookInfo.get(0).getTextTrim();
book = new Book(name, author, price, publish, bookid);
//将书存放在list集合中
bookList.add(book);
System.out.println(book.toString());
book = null;
}
}
}
<?xml version="1.0" encoding="gb2312"?>
<书架>
<书 出版社="北京大学出版社" 书号="a3234">
<书名>Java就业培训教程</书名>
<作者>张孝祥</作者>
<售价>39.00元</售价>
</书>
<书 出版社="郑州大学出版社" 书号="b3234">
<书名>JavaScript网页开发</书名>
<作者>张孝祥</作者>
<售价>28.00元</售价>
</书>
</书架>