使用DOM方法實現xml文檔內容的解析與寫入

java中對xml文檔的解析可以分爲四種方式:DOM、JDOM、SAX、DOM4J

這裏研究一下使用DOM方式進行xml文檔的寫入和解析的方法。


DOM解析XML文檔時會遍歷整個XML文檔,在內存中建立一個樹的數據結構。與JavaScriptDOM方法類似,我們可以通過getElementsByTagName方法獲取到特定的標籤對象,當然,同樣的標籤很多的話要使用List來存儲返回的多個標籤對象。另外通過DOMXML文檔也很方便,創建了節點之後依次連接到父節點上就OK了,最後通過Transformer把駐留在內存中建立好的DOM樹通過io流寫入到特定文本就OK

使用DOM方式進行XML解析——

創建了一份簡單的xml文檔

eclipse中新建項目DOM_Test,並把該xml文檔拷貝到工程目錄下。在代碼中利用documentBuilder的parse方法可以傳入需要被解析的XML文檔。最後把解析出的元素輸出,控制檯輸出結果貼個圖:

附上 DOM解析XML文檔的java代碼demo:

public class DOM_Test {

	public static void main(String[] args) {
		//創建一個documentBuilderFactory對象
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		//創建一個documentBuilder對象
		try {
			DocumentBuilder db = dbf.newDocumentBuilder();
			//通過documentBuilder對象的parse方法加載book.xml到當前項目下
			Document document = db.parse("book.xml");//傳入需要被解析的XML文檔的URI
			//獲取所有book節點的集合
			NodeList bookList = document.getElementsByTagName("book");//通過標籤獲取元素
			System.out.println("查詢到有:"+bookList.getLength()+"本書");
			for (int i = 0; i < bookList.getLength(); i++) {
				System.out.println("===========下面開始遍歷第"+(i+1)+"本書的內容============");
				Element book = (Element) bookList.item(i);
				String value = book.getAttribute("id");
				System.out.println("屬性id的值爲:"+value);
				//解析book節點和子節點
				Node book_node = bookList.item(i);
				NodeList childlist = book_node.getChildNodes();
				System.out.println("第"+(i+1)+"本書共有"+childlist.getLength()+"個子節點");
				for (int j = 0; j < childlist.getLength(); j++) {
					if (childlist.item(j).getNodeType() == Node.ELEMENT_NODE) {
						System.out.print("第"+(j+1)+"個節點的節點名:");
						System.out.println(childlist.item(j).getNodeName()+" ---> "+
								childlist.item(j).getFirstChild().getTextContent());
					}
				}
				System.out.println("============book "+(i+1)+"  END==================");
			}
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

}

============================================================================

使用DOM方式進行XML創建和寫入:

同理,利用documentBuilder就可以對xml文檔進行build。在代碼中創建好標籤元素Element,並將其按照順序通過append方法連接起來,運行時在內存中就會構建一個DOM樹,最後用Transformer建立一個IO流把DOM樹寫入到目標文檔裏。

這是通過DOM創建的一份XML文檔——


附上DOM創建寫入XML文檔的java代碼demo:

public class DOM_Write {
	public DocumentBuilder getDocumentBuilder(){
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = null;
		try {
			db = dbf.newDocumentBuilder();
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return db;
	}
	public void createXML(){
		DocumentBuilder db = getDocumentBuilder();
		Document document = db.newDocument();
		document.setXmlStandalone(true);
		Element bookstore = document.createElement("bookstore");
		//向bookstore中添加子節點book
		//創建子節點
		Element book = document.createElement("book");
		Element name = document.createElement("name");
		Element author = document.createElement("author");
		Element year = document.createElement("year");
		Element publishing = document.createElement("publishing");
		//給子節點賦值
		name.setTextContent("退一步,並不難");
		author.setTextContent("達照");
		year.setTextContent("2015");
		publishing.setTextContent("中國商業出版社");
		//把子節點都連接到父節點上
		book.appendChild(name);
		book.appendChild(author);
		book.appendChild(year);
		book.appendChild(publishing);
		book.setAttribute("id", "3");
		//把book節點添加到bookstore中
		bookstore.appendChild(book);
		//把bookstore節點(包含book)添加到DOM樹中
		document.appendChild(bookstore); 
		
		//創建TransformerFactory對象
		TransformerFactory tff = TransformerFactory.newInstance();
		try {
			//創建Transformer對象
			Transformer tf = tff.newTransformer();
			tf.setOutputProperty(OutputKeys.INDENT, "yes");//換行
			tf.transform(new DOMSource(document), new StreamResult(new File("book1.xml")));
		} catch (TransformerConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (TransformerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		DOM_Write write = new DOM_Write();
		write.createXML();
	}
}

有一個注意事項,在eclipse中創建document對象和element對象時候需要進行導包,這裏導入的包應該是org.w3c.dom.Document和org.w3c.dom.Element,否則沒有提供操縱XML的api,會報錯。此demo裏需要導入的剩下的包都是javax.xml下的包。

最近在學習web service。發現在service發佈方和service使用方,都涉及到大量的xml的解析和寫入。故做此博客,做學習過程中的一個小結。

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