Dom4j解析项目xml文件

来源:互联网 发布:多梦疲劳知乎 编辑:程序博客网 时间:2024/04/30 20:43
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并且不好任何属性的节点的集合/** * 例如:/书架/书/书名   此解析式意思为在书架标签下的书下的标签名为书名的这个标签 *  */@Testpublic void test()throws Exception{//1.获取解析器SAXReader reader = new SAXReader();//2.解析xmlDocument 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.解析xmlDocument 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元</售价>   </书> </书架>



 

原创粉丝点击