dom讀寫xml文件修改屬性值詳解

一、基本概念

SAX(Simple API for XML)

  • 只能讀,不能修改,只能順序訪問,適合解析大型XML,解析速度快
  • 常應用於處理大量數據的XML,實現異構系統的數據訪問,實現跨平臺
  • 從文檔的開始通過每一節點移動,定位一個特定的節點

DOM(Document Object Model)

  • 不僅能讀,還能修改,而且能夠實現隨機訪問,缺點是解析速度慢,適合解析小型文檔
  • 一般應用與小型的配置XML,方便操作
  • 爲載入到內存的文檔節點建立類型描述,呈現可橫向移動、潛在巨大的樹型結構
  • 在內存中生成節點樹操作代價昂貴

JDOM

  •      僅使用具體類而不使用接口
  •      API大量使用了Collections類

DOM4J:

  •      是JDOM的一種智能分支,它合併了許多超出基本xml文檔表示的功能
  •      使用接口和抽象基本類方法,是一個優秀的java xml API
  •      具有性能優異、靈活性好、功能強大和極端易用的特點
  •      是一個開放源代碼的軟件

二、關於性能

性能測試:(少量數據時)SAX>DOM>DOM4J>JDOM

三、功能詳解

解析xml格式的 sdl文件sld:ColorMapEntry 並且修改color屬性顏色#F7FCB9更改成#000000,文件內容如下↓。

四、測試代碼

package com.kero99.utils;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
 * dom解析sdl文件
 * @author ygc
 *
 */
public class DomTest {
		public static void main(String[] args) throws SAXException, IOException, TransformerException {
			//創建解析工廠
			DocumentBuilderFactory sdl=DocumentBuilderFactory.newInstance();		
			try {
				//創建文件解析
				DocumentBuilder file= sdl.newDocumentBuilder();
				//解析文件路徑及名稱
				Document  document= file.parse("D:\\cottonproduct.sld");
				NodeList list=document.getElementsByTagName("sld:ColorMapEntry");
				   for(int i=0;i<list.getLength();i++) {
					   Element node=(Element) list.item(i);
					   if(node.getAttribute("color").equals("#F7FCB9")) {
                                                    //修改屬性
						   node.setAttribute("color", "#000000");
					   }
					   //輸出color屬性值
		               String color=node.getAttributes().getNamedItem("color").getNodeValue();
		               System.out.println(color);
		               TransformerFactory tff = TransformerFactory.newInstance();
			            try {
			            	//保存修改
							Transformer tf= tff.newTransformer();
							tf.transform(new DOMSource(document),new StreamResult(new File("D:\\cottonproduct.sld")));
						} catch (TransformerConfigurationException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
				   }
			
			} catch (ParserConfigurationException e) {
				e.printStackTrace();
			}
		}
}

五、測試結果

成功如下圖所示,參數可以在接口改爲動態的。

 

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