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元</售價>
</書>
</書架>