JAXP對XML的DOM解析(增刪改查)

DOM是用與平臺和語言無關的方式表示XML文檔的官方W3C標準。DOM是以層次結構組織的節點或信息片斷的集合。這個層次結構允許開發人員在樹中尋找特定信息。分析該結構通常需要加載整個文檔和構造層次結構,然後才能做任何工作。由於它是基於信息層次的,因而DOM被認爲是基於樹或基於對象的。 DOM 以及廣義的基於樹的處理具有幾個優點。首先,由於樹在內存中是持久的,因此可以修改它以便應用程序能對數據和結構作出更改。它還可以在任何時候在樹中上下導航,而不是像SAX那樣是一次性的處理。DOM使用起來 也要簡單得多。

下面列出實例,首先是需要操作的XML文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><書架>
	<書 name="XXX">
		<書名>java編程思想4</書名>	
	 	<售價>39</售價>
	</書>
	<書>
		<書名>java編程思想2</書名>
		<作者>BBB</作者>
		<售價>0</售價>
	</書>
</書架>
接下來是JAXP對XML的操作

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class XmlParserDemo {
	/**
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		// 新建一個DocumentBuilderFactory 解析器工廠
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		// 通過解析器工廠產生一個解析器對象
		DocumentBuilder builder = factory.newDocumentBuilder();
		// 解析器對象有一個parse的方法可以讀進來一個xml文件
		// 讀到的xml文件是以document對象的方式保存在內存中的
		Document document = builder.parse("src/book.xml");
		// listAllNode(document);
		//listAllNode1(document);
		readElement(document);
		//update(document);
		//readAttribute(document);
		//add(document);
		//add1(document);
		//delete(document);
		//removeAttribute(document);
		//addAttribute(document);
		//updateAttribute(document);
	}
	
	//打印所有節點的名字
	public static void listAllNode(Node node) {
		System.out.println(node.getNodeName());
		NodeList list = node.getChildNodes();
		for (int i = 0; i < list.getLength(); i++) {
			Node child = list.item(i);
			listAllNode(child);
		}
	}
	//打印所有元素節點的名字
	public static void listAllNode1(Node node) {
		if (node.getNodeType() == Node.ELEMENT_NODE) {
			System.out.println(node.getNodeName());
		}
		NodeList list = node.getChildNodes();
		for (int i = 0; i < list.getLength(); i++) {
			Node child = list.item(i);
			listAllNode1(child);
		}
	}
	//讀取某個xml元素的內容
	public static void readElement(Document document)
	{
		NodeList list= document.getElementsByTagName("書名");
		Node node= list.item(0);
		System.out.println(node.getTextContent());
	}
	//讀取某個xml元素的屬性
	public static void readAttribute(Document document)
	{
		NodeList list= document.getElementsByTagName("書");
		Node node= list.item(0);
		NamedNodeMap map= node.getAttributes();
		for(int i=0;i<map.getLength();i++)
		{
			Node attr = map.item(i);
			System.out.println(attr.getNodeName()+"="+attr.getNodeValue());
		}
	}
	//增加一個標籤
	public static void add(Document document) throws Exception
	{
		//首先要創建一個標籤
		Node node= document.createElement("售價");
		node.setTextContent("39");
		//把標籤掛到根節點上去
		Node price =document.getElementsByTagName("書").item(0);
		price.appendChild(node);
		
		
		//通過transformer方法把一個內存中的document寫到文件中去
		TransformerFactory factory= TransformerFactory.newInstance();
		Transformer trans= factory.newTransformer();
		trans.transform(new DOMSource(document) , new StreamResult(new File("src/book.xml")) );
	}
	//在中間創建一個標籤
	public static void add1(Document document) throws Exception
	{
		//首先要創建一個標籤
		Node node= document.createElement("作者");
		node.setTextContent("AAA");
		//把標籤掛到根節點上去
		Node author =document.getElementsByTagName("書").item(0);
		author.insertBefore(node,document.getElementsByTagName("售價").item(0) );
		
		
		//通過transformer方法把一個內存中的document寫到文件中去
		TransformerFactory factory= TransformerFactory.newInstance();
		Transformer trans= factory.newTransformer();
		trans.transform(new DOMSource(document) , new StreamResult(new File("src/book.xml")) );
	}
	
	//刪除某個標籤 。
	public static void delete(Document document) throws Exception
	{
		//先找到要刪除的節點
		Node author= document.getElementsByTagName("作者").item(0);
		//通過這個節點找到他的父親節點,再通過父親節點刪除當前節點
		author.getParentNode().removeChild(author);
		//新建一個transformer工廠類
		TransformerFactory factory= TransformerFactory.newInstance();
		//通過transformer的一個靜態方法得到transformer的一個實例類
		Transformer trans= factory.newTransformer();
		//transformer實例類有一個寫的方法 把內存中的文件寫到硬盤上 從source到result
		trans.transform(new DOMSource(document) , new StreamResult(new File("src/book.xml")) );
	}
	
	//更改某個標籤
	public static void update(Document document) throws Exception
	{
		Node node= document.getElementsByTagName("書名").item(0);
		node.setTextContent("數據結構");
		TransformerFactory factory= TransformerFactory.newInstance();
		Transformer trans= factory.newTransformer();
		trans.transform(new DOMSource(document), new StreamResult(new File("src/book.xml")) );
	}
	
	//刪除某個屬性
	public static void removeAttribute(Document document) throws Exception
	{
		Element element= (Element)document.getElementsByTagName("書").item(0);
		element.removeAttribute("name");
		TransformerFactory factory= TransformerFactory.newInstance();
		//通過transformer的一個靜態方法得到transformer的一個實例類
		Transformer trans= factory.newTransformer();
		//transformer實例類有一個寫的方法 把內存中的文件寫到硬盤上 從source到result
		trans.transform(new DOMSource(document) , new StreamResult(new File("src/book.xml")) );
	}
	//增加某個屬性
	public static void addAttribute(Document document) throws Exception
	{
		Attr att= document.createAttribute("name");
		att.setTextContent("AAA");
		Element element= (Element)document.getElementsByTagName("書").item(0);
		element.setAttributeNode(att);
		TransformerFactory factory= TransformerFactory.newInstance();
		//通過transformer的一個靜態方法得到transformer的一個實例類
		Transformer trans= factory.newTransformer();
		//transformer實例類有一個寫的方法 把內存中的文件寫到硬盤上 從source到result
		trans.transform(new DOMSource(document) , new StreamResult(new File("src/book.xml")) );
	}
	
	//更新某個屬性
	public static void updateAttribute(Document document) throws Exception
	{
		Element element= (Element)document.getElementsByTagName("書").item(0);
		element.setAttribute("name", "bbb");
		TransformerFactory factory= TransformerFactory.newInstance();
		Transformer trans= factory.newTransformer();
		trans.transform(new DOMSource(document), new StreamResult(new File("src/book.xml")));
	}
	
}

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