1. 程式人生 > >dom解析方式對xml文件進行操作

dom解析方式對xml文件進行操作

<span style="font-size:14px;"><?xml version="1.0" encoding="utf-8" standalone="no"?><書架>
			  <書>
			  	  <書名 name="xxx">java就業培訓教程</書名>
			  	  <作者>張孝祥</作者>
			  	  <售價>36.2元</售價>
	   		 </書> 
			  
			   <書>
			  	  <書名>javascript就業培訓教程</書名>
			  	  <作者>張孝祥</作者>
			  	  <售價>36.2元</售價>
			  </書>  
		 
</書架></span>
<span style="font-size:14px;">package com.rj.xml;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.junit.Test;
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;
import org.xml.sax.SAXException;

//使用dom方式對xml文件進行crud
public class Demo01 {

	//讀取xml文件中:  <書名>javascript就業培訓教程</書名> 節點的值
	@Test
	public void read1() throws Exception{
		//1.建立工廠
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
	
		//2.得到dom解析器
		DocumentBuilder builder = factory.newDocumentBuilder();
	
		//解析xml文件,得到代表文件的document物件
		Document document = builder.parse("src/book.xml"); 
		
		NodeList nodeList = document.getElementsByTagName("書名");//通過書名,查詢所有書名的節點,即元素
		Node node = nodeList.item(1); //返回集合中的第 index 個項。
		String content = node.getTextContent();//返回節點中內容
		System.out.println(content); 
	}
	/*
	 * dom解析下,xml文件的每一個組成部分都會用一個物件表示,例如標籤用Element,屬性用Attr,
	 * 但不管什麼物件,都是Node的子類,所以在開發中可以把獲取到的任意結點都當作Node對待.
	 * */
	
	//得到xml中的所有標籤
	@Test
	public void read2() throws Exception{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document document = builder.parse("src/book.xml"); 
		
		//得到根節點
		NodeList  nodeList = document.getElementsByTagName("書架");
		Node root = nodeList.item(0);
		//或者直接 document.getElementsByTagName("書架").item(0);
		
		list(root);//遞迴過去所有節點
		
	}

	private void list(Node node) {
		
		if(node instanceof Element){
			System.out.println(node.getNodeName());
		}
		
		NodeList list = node.getChildNodes();//獲取此結點下一層的所有結點,包括空格
	//	System.out.println(list.getLength());
		for(int i=0;i<list.getLength();i++){
			Node child = list.item(i);
			list(child);
		}
	
	}
	
	//得到xml中文件屬性的值: <書名 name="xxx">java就業培訓教程</書名>
		@Test
		public void read3() throws Exception{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document document = builder.parse("src/book.xml"); 
			 
			/*
			Node node = document.getElementsByTagName("書名").item(0);
			NamedNodeMap namedNodeMap = node.getAttributes(); 
			System.out.println(namedNodeMap.getNamedItem("name").getTextContent());
			當NamedNodeMap有多個的時候遍歷比較麻煩,因此從他的子類Element這個類中找方法直接獲取值
			*/
			
			Element bookname =   (Element) document.getElementsByTagName("書名").item(0);
			 String value = bookname.getAttribute("name");
			 System.out.println(value);
		}
		
		//向xml中新增節點:第一本書中新增 <售價>50.0元</售價>
		@Test
		public void add01() throws Exception{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document document = builder.parse("src/book.xml");
		
			
			/*
			 * 插入這個資料,先獲取他的上一層的節點,利用他的節點,插入
			 * 建立節點時候,先建立再填充內容
			 * */
			//建立節點
			Element price = document.createElement("售價");
			price.setTextContent("50.0元");
			
			//把建立的節點掛到第一本書上
			Element book = (Element) document.getElementsByTagName("書").item(0);
			book.appendChild(price);
			
			
			/*
			 * 更新xml文件
			 * javax.xml.transform包中的Tranformer類用於把代表XML檔案的Document物件轉換為某種格式後進行輸出
			 * 例如:把xml檔案應用樣式表後轉成一個html文件,利用這個物件,當然也可以把Document物件由重新寫入一個XML檔案中。
			 * 
			 * Tranformer類通過transform方法完成轉化操作,該方法接收一個源和一個目的地.
			 * 我們可以通過:
			 *   javax.xml.transform.dom.DOMSource類來關聯要轉換的document物件
			 *   用javax.xml.transform.stream.StreamResult物件來表示資料的目的地
			 *   
			 *   Tranformer物件通過TransformFactory獲得
			 * 
			 * */
			
			/*
			 * Transformer獲取,用工廠類TransformerFactory中的靜態方法--
			 * static TransformerFactory newInstance() 
          		 獲取 TransformerFactory 的新例項。 
          		
          		TransformerFactory中的方法:得到Transformer物件
          		abstract  Transformer newTransformer() 
          	建立執行從 Source 到 Result 的複製的新 Transformer。 
          
			 * Transformer抽象類裡面有這樣一個方法
			 * abstract  void transform(Source xmlSource, Result outputTarget) 
          	 *	將 XML Source 轉換為 Result。 
			 *
			 * 怎麼通過Source的物件獲取document物件-->Source的介面實現類DOMSource的構造方法
			 * DOMSource(Node n) 
          	    建立帶有 DOM 節點的新輸入源。
			 * 
			 * Result的介面實現類StreamResult中的構造方法:
			 * StreamResult(OutputStream outputStream) 
          	         從位元組流構造 StreamResult。
			 * */
			//更新後記憶體寫回到xml文件中
			TransformerFactory transformerFactory = TransformerFactory.newInstance();
			Transformer transformer = transformerFactory.newTransformer();
			transformer.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml"))) ;
		
		}
		
		//在指定位置插入元素 <售價>36.2元</售價>節點之前
		@Test
		public void add02() throws Exception{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document document = builder.parse("src/book.xml"); 
			
			//建立節點
			Element price = document.createElement("售價");
			price.setTextContent("59.9元");
			
			//得到參考節點
			Element refNode = (Element) document.getElementsByTagName("售價").item(0);
		
			//得到要掛崽的節點,即參考節點的上一層的節點
			Element book = (Element) document.getElementsByTagName("書").item(0);
			
			//往book的指定位置插崽,即插入參考節點
			book.insertBefore(price,refNode);
			
			//更新xml
			TransformerFactory transformerFactory = TransformerFactory.newInstance();
			Transformer transformer = transformerFactory.newTransformer();
			transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
			} 
		
		
		
		//向xml文件中新增屬性: <書名>java就業培訓教程</書名>--> name="xxx"
		@Test
		public void addAttr() throws Exception{
			 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
			 DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder();
			 Document document = builder.parse("src/book.xml");
			 
			 Element bookname = (Element) document.getElementsByTagName("書名").item(0);
			 bookname.setAttribute("name", "xxx");
			 
			 TransformerFactory transformerFactory = TransformerFactory.newInstance();
			 Transformer transformer = transformerFactory.newTransformer();
			 transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
		} 
		
		
		//刪除第一個書名節點的售價:<售價>36.2元</售價>
		@Test
		public void delete1() throws Exception{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document document = builder.parse("src/book.xml");
			
			//得到要刪除的節點
			Element e = (Element) document.getElementsByTagName("售價").item(0);
			
			//得到要刪除節點的爸爸
			 Element book = (Element) document.getElementsByTagName("書").item(0);
			
			 //爸爸想刪除
			 book.removeChild(e);
			 
			 //更新結果集
			 TransformerFactory transformerFactory = TransformerFactory.newInstance();
			 Transformer transformer = transformerFactory.newTransformer();
			 transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
		}
		 

          //刪除  <售價>36.2元</售價>的父親節點
		@Test
		public void delete2() throws Exception{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document document = builder.parse("src/book.xml");
			
			//得到要刪除的節點
			//e.getParentNode()-->獲取此節點的父親節點
			Element e = (Element) document.getElementsByTagName("售價").item(0);
			e.getParentNode().getParentNode().removeChild(e.getParentNode());
			//刪除所有節點
			//記住根節點的爸爸是document
			 //e.getParentNode().getParentNode().getParentNode().removeChild(e.getParentNode().getParentNode());
		 
		 
			 //更新結果集
			 TransformerFactory transformerFactory = TransformerFactory.newInstance();
			 Transformer transformer = transformerFactory.newTransformer();
			 transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
		}
		
		
		
		
		//跟新售價 <售價>36.2元</售價>-->100元
		@Test
		public void update() throws Exception{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document document = builder.parse("src/book.xml");
			
			Element e = (Element) document.getElementsByTagName("售價").item(0);
			e.setTextContent("100元");
			 //更新結果集
			 TransformerFactory transformerFactory = TransformerFactory.newInstance();
			 Transformer transformer = transformerFactory.newTransformer();
			 transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
		}
	 }

		 
	 
</span>