Dom4j解析項目xml文件

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



 

發佈了34 篇原創文章 · 獲贊 9 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章