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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章