1. 程式人生 > >xml解析之----DOM解析

xml解析之----DOM解析

dom模型 web margin java dom ext des ins api

DOM模型(documentobject model) ?DOM解析器在解析XML文檔時,會把文檔中的全部元素。依照其出現的層次關系。解析成一個個Node對象(節點)。 ?在dom中。節點之間關系例如以下: ?位於一個節點之上的節點是該節點的父節點(parent) ?一個節點之下的節點是該節點的子節點(children) ?同一層次,具有同樣父節點的節點是兄弟節點(sibling) ?一個節點的下一個層次的節點集合是節點後代(descendant) 父、祖父節點

lNode對象提供了一系列常量來代表結點的類型,當開發者獲得某個Node類型後,就能夠把Node
節點轉換成對應的節點對象(Node的子類對象),以便於調用其特有的方法。

(查看API文檔) lNode對象提供了對應的方法去獲得它的父結點或子結點。編程人員通過這些方法就能夠讀取整個XML文檔的內容、或加入、改動、刪除XML文檔的內容了。


首先引出要解析的xml文件:

<?

xml version="1.0" encoding="UTF-8"?

><書架> <書> <書名>javaweb開發</書名> <作者 id="12">張孝祥</作者> <售價>59元</售價> </書> <書> <書名>JavaScript網頁開發</書名> <作者>張孝祥</作者> <售價>28.00元</售價> </書> </書架>


下面即是對xml的增刪改查操作:

import java.io.FileOutputStream;

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.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.junit.Before;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class Demo3 {

	/**
	 * 利用dom完畢文檔的crud
	 * @param args
	 * @throws Exception 
	 * @throws ParserConfigurationException 
	 * @throws Exception 
	 * @throws SAXException 
	 * @throws Exception 
	 */
	private Document document;
	@Before
	public void before() throws Exception{
		//獲得dom解析工廠類
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		//得到dom解析器
		DocumentBuilder builder = factory.newDocumentBuilder();
		//解析xml文件
		document = builder.parse("src/book.xml");
	}
	
	//遍歷
	@Test
	public void listXml() throws ParserConfigurationException, SAXException, Exception{
		list(document);
	}
	
	public void list(Node node){
		//打印結點的名稱
		System.out.println(node.getNodeName());
		//獲得全部子節點
		NodeList list = node.getChildNodes();
		for(int i=0;i<list.getLength();i++){
			Node child = list.item(i);
			//遞歸整個dom樹
			list(child);
		}
	}
	
	//讀取書名節點的值:<書名>javaweb開發</書名>
	@Test
	public void test1(){
		Document document = this.document;
		Node node = document.getElementsByTagName("書名").item(0);
		String value = node.getTextContent();
		System.out.println(value);
	}
	
	//讀取書名屬性的值:<售價 type="rmb">39.00元</售價> 
	@Test
	public void test2(){
		Document document = this.document;
		Node node = document.getElementsByTagName("售價").item(0);
		Element price =  (Element) node;   //發現node滿足不了。把node強轉成對應類型
		String attValue = price.getAttribute("type");
		System.out.println(attValue);
	}
	
	//向xml文檔中加入售價節點
	@Test
	public void test3() throws Exception{
		Document document = this.document;
		//創建要掛的節點
		Element price = document.createElement("售價");
		price.setTextContent("59元");
		//把創建的結點掛到書節點下
		Node book = document.getElementsByTagName("書").item(0);
		book.appendChild(price);
		
		//把內存中更新後對象樹,又一次定回到xml文檔中
		TransformerFactory factory = TransformerFactory.newInstance();
		Transformer tf = factory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
	}
	
	
	//向xml文檔中指定位置上加入售價節點
	@Test
	public void test4() throws Exception{
		Document document = this.document;
		
		//創建要加入的節點
		Element price = document.createElement("售價");
		price.setTextContent("59元");
		
		//得到要向哪個節點上掛子節點
		Node book = document.getElementsByTagName("書").item(0);
		
		//向參考節點前,掛新節點
		book.insertBefore(price, document.getElementsByTagName("售價").item(0));
		
		//把內存中更新後對象樹,又一次定回到xml文檔中
		TransformerFactory factory = TransformerFactory.newInstance();
		Transformer tf = factory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
		
	}
	
	//向xml文檔加入節點屬性
	@Test
	public void test5() throws Exception{
		Document document = this.document;
		
		//得到要加入屬性的節點
		Element author = (Element) document.getElementsByTagName("作者").item(0);
		author.setAttribute("id", "12");  //向節點掛屬性
		
		//把內存中更新後對象樹,又一次定回到xml文檔中
		TransformerFactory factory = TransformerFactory.newInstance();
		Transformer tf = factory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
		
	}
	
	
	//刪除xml文檔中的售價節點
	@Test
	public void test6() throws Exception{
		
		Document document = this.document;
		
		//得到要刪除的節點
		Node price = document.getElementsByTagName("售價").item(0);
		
		//得到要刪除的節點的父親
		Node parent = document.getElementsByTagName("書").item(0);
		
		parent.removeChild(price);
		

		//把內存中更新後對象樹,又一次定回到xml文檔中
		TransformerFactory factory = TransformerFactory.newInstance();
		Transformer tf = factory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
	}
	
	//刪除2   : 刪除售價節點所在的書結點
	@Test
	public void test7() throws Exception{
		
		Document document = this.document;
		
		//得到要刪除的節點
		Node price = document.getElementsByTagName("售價").item(0);
		price.getParentNode().getParentNode().removeChild(price.getParentNode());
		

		//把內存中更新後對象樹。又一次定回到xml文檔中
		TransformerFactory factory = TransformerFactory.newInstance();
		Transformer tf = factory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
	}
	
	
	@Test
	public void test8() throws Exception{
		Document document = this.document;
		document.getElementsByTagName("售價").item(1).setTextContent("19元");
		//把內存中更新後對象樹。又一次定回到xml文檔中
		TransformerFactory factory = TransformerFactory.newInstance();
		Transformer tf = factory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
	}
	
	
	
	
	
	

}



xml解析之----DOM解析