基於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();
}
}
運行結果: