xml文檔解析之dom4j的增刪改查 ,亂碼問題

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





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章