基于Dom解析和SAX解析這兩種解析思想,出現了許多解析API,其中dom4j可以使用dom解析的方式高效的解析xml文檔。dom4j解析在使用時需要導入第三方jar包,dom4j的開發包可以在網上找得到。導入開發包時一般只需要導入核心的開發包就可以直接使用,如果是在使用的過程當中提示缺少什么包可以到dom4j的lib目錄下導入缺少的開發包即可。使用dom4j實現xml文檔的增刪改查的基本操作。首先還是準備一個xml文檔。
<books> <book> <title>java從入門到放棄</title> <PRice>10元</price> <author age="12歲">張三</author> </book> <book> <title>C語言從入門到放棄</title> <price>12元</price> <author>李四</author> </book> </books> 首先我們要先了解dom4j中的一些方法,通過查閱api可以得到得到,就不在贅述了。利用dom4j實現的的增刪改查的操作。增:在指定的位置處插入一個節點,首先利用DocumentHelper里面的createElement方法創建一個節點,然后在使用setText設置節點的標簽體以及屬性等,接著找到要插入位置的父節點,利用父節點身上的add方法添加節點。
刪:在指定的位置刪除某一個節點。首先要找到這個節點,接著找到這個節點的父節點,然后利用父節點的remove方法刪除節點。
改:修改某個節點的屬性或者標簽體,還是找到這個節點利用addAttribute方法修改屬性,當節點沒有這個屬性時就自動加上,有的話就自動更新。當屬性的值設置為null是表示刪除這個屬性。
查:沒什么好說的。
要特別注意的是增刪改,對xml的增刪改只是對內存當中的document對象進行操作,如果希望修改對xml文檔起作用,還需要將內存當中的document對象寫入xml文檔中,但是還要注意xml亂碼的問題。
xml亂碼的問題:dom4j將文檔載入內存時使用的是xml文檔申明時中的Encoding屬性的編碼集進行的編碼,如果在此時使用的writer的內部編碼集與最初載入時的編碼集不同時,就會出現亂碼問題,下面使用了幾種不同的方式解決xml亂碼的問題。
java實現:1.查找第二本書的名字和作者的名字。2。向book下面插入sale-price標簽,并將第一本書設置為12元,第二本書設置為19元。3.將第一本書的sale-price刪除掉.4將第一本書的作者的年齡改為22歲。
package com.hhuc.Dom4j;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStreamWriter;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;import org.junit.Test;public class Dom4jDemo2 { @Test public void find() throws DocumentException{ SAXReader reader=new SAXReader();//創建解析器 Document document=reader.read("book.xml");//利用解析器讀入xml文檔 Element dom=document.getRootElement();//獲取文檔的根節點 List<Element> list=dom.elements();//返回包含在dom根節點里面的元素book String bookname=list.get(1).elementText("title"); //String bookname1=list.get(1).element("title").getText(); //System.out.println(bookname1); String attribute=list.get(0).elementText("author"); System.out.println(attribute); } @Test public void add() throws DocumentException, IOException{ SAXReader reader=new SAXReader();//創建解析器 Document document=reader.read("book.xml");//利用解析器讀入xml文檔 Element dom=document.getRootElement();//獲取文檔的根節點 Element addele=DocumentHelper.createElement("sale-price"); Element addele1=DocumentHelper.createElement("sale-price"); addele.setText("12元");addele1.setText("19元"); list.get(0).add(addele); list.get(1).add(addele1); OutputStreamWriter out=new OutputStreamWriter(new FileOutputStream("book.xml"),"utf-8"); dom.write(out); out.flush();out.close(); } @Test public void delete() throws DocumentException, IOException{ SAXReader sr = new SAXReader();//創建解析器 Document domcument = sr.read("book.xml");//利益能夠解析器讀入xml文檔 Element dom =domcument.getRootElement();//獲取xml文檔根節點 Element ele=dom.element("book").element("sale-price"); ele.getParent().remove(ele); OutputFormat format=OutputFormat.createPrettyPrint();//格式化輸出 format.setEncoding("gb2312"); XMLWriter writer=new XMLWriter(new FileOutputStream("book.xml"),format); writer.write(domcument); writer.flush(); writer.close(); } @Test public void transform() throws DocumentException, IOException{ SAXReader sr=new SAXReader();//創建解析器 Document document=sr.read("book.xml");//讀入xml文檔 Element root=document.getRootElement();//獲取根節點 Element author=root.element("book").element("author"); author.addAttribute("age", "22"); OutputFormat format=OutputFormat.createPrettyPrint(); XMLWriter writer=new XMLWriter(new OutputStreamWriter(new FileOutputStream("book.xml"),"utf-8"),format); writer.write(document); writer.flush();writer.close(); }}運行結果:
|
新聞熱點
疑難解答