DOM,即Document Object Model,中文名字叫文件物件模型。用來以獨立於平台和語言的方式訪問和修改一個文檔的內容和結構。
在java項目中使用DOM時,不需要額外引入jar包,因為JDK中已經包含了org.w3c.dom。
由於要在項目中,存在一些複雜的結構資料,這些資料之間的關係成樹狀形式,為了降低資料庫設計的複雜度,所以在關係資料表中嵌入XML欄位以儲存這些資料,而不是通過關聯表的形式(註:使用的是DB2 v9.5)。當在對XML欄位進行增加、編輯、刪除、尋找等操作時,需要對資料進行String到XML、XML到String之間的轉換,而負責該轉換工作的就是DOM。
為了儘可能地避免代碼的重複和和代碼維護,特編寫一個一個StringXMLTransform類,該類主要是用來生產XML文檔,以及 String與Document之間的轉換(仍需完善),代碼如下:
package com.ciae.ne.common.classLib;<br />import java.io.IOException;<br />import java.io.InputStream;<br />import java.io.StringReader;<br />import java.io.StringWriter;<br />import javax.xml.parsers.DocumentBuilder;<br />import javax.xml.parsers.DocumentBuilderFactory;<br />import javax.xml.parsers.ParserConfigurationException;<br />import javax.xml.transform.Transformer;<br />import javax.xml.transform.TransformerConfigurationException;<br />import javax.xml.transform.TransformerException;<br />import javax.xml.transform.TransformerFactory;<br />import javax.xml.transform.TransformerFactoryConfigurationError;<br />import javax.xml.transform.dom.DOMSource;<br />import javax.xml.transform.stream.StreamResult;<br />import org.w3c.dom.Document;<br />import org.w3c.dom.Element;<br />import org.xml.sax.InputSource;<br />import org.xml.sax.SAXException;<br />public class StringXMLTransform {<br />//解析器工廠類<br />private DocumentBuilderFactory docBuilderFactory=null;<br />//解析器<br />private DocumentBuilder docBuilder=null;<br />//操作的Document對象<br />private Document doc=null;</p><p>//private static StringXMLTransform stringXML;<br />public StringXMLTransform()<br />{<br />if(docBuilderFactory==null)<br />docBuilderFactory=DocumentBuilderFactory.newInstance();<br />try {<br />docBuilder=docBuilderFactory.newDocumentBuilder();<br />doc=docBuilder.newDocument();<br />//設施XML版本號碼<br />doc.setXmlVersion("1.0");</p><p>} catch (ParserConfigurationException e) {<br />e.printStackTrace();<br />}<br />}</p><p>/*public static StringXMLTransform newInstance()<br />{<br />if(stringXML==null)<br />return new StringXMLTransform();<br />return stringXML;<br />}*/<br />/**<br /> * 添加註釋<br /> */<br />public void SetComment(String comment)<br />{<br />doc.appendChild(doc.createComment(comment));<br />}<br />/**<br /> * 建立元素節點<br /> * @param elementName<br /> * @return<br /> */<br />public Element createElement(String elementName)<br />{<br />return doc.createElement(elementName);<br />}<br />public Document getDoc() {<br />return doc;<br />}<br />/**<br /> *添加元素節點<br /> * @param element<br /> */<br />public void addElement(Element element)<br />{<br />doc.appendChild(element);<br />}<br />/**<br /> * 將XML文檔轉換為String類型<br /> * @return<br /> */<br />public String outputString()<br />{<br /> TransformerFactory transFactory = TransformerFactory.newInstance();</p><p> // 設定輸出結果<br /> DOMSource domSource = new DOMSource(doc);</p><p> StringWriter sw=new StringWriter();</p><p> try {<br />Transformer tf=transFactory.newTransformer();<br />tf.transform(domSource, new StreamResult(sw));<br />} catch (TransformerConfigurationException e) {<br />e.printStackTrace();<br />} catch (TransformerFactoryConfigurationError e) {<br />e.printStackTrace();<br />} catch (TransformerException e) {<br />e.printStackTrace();<br />}<br />return sw.toString();<br />}<br />/**<br /> * 將Document轉換為String<br /> * @param document<br /> * @return<br /> */<br />public String DocumentToString(Document document)<br />{<br /> TransformerFactory transFactory = TransformerFactory.newInstance();</p><p> // 設定輸出結果<br /> DOMSource domSource = new DOMSource(document);</p><p> StringWriter sw=new StringWriter();</p><p> try {<br />Transformer tf=transFactory.newTransformer();<br />tf.transform(domSource, new StreamResult(sw));<br />} catch (TransformerConfigurationException e) {<br />e.printStackTrace();<br />} catch (TransformerFactoryConfigurationError e) {<br />e.printStackTrace();<br />} catch (TransformerException e) {<br />e.printStackTrace();<br />}<br />return sw.toString();<br />}</p><p>public void StringToDocument(String content)<br />{<br />try {<br />doc=docBuilder.parse(new InputSource(new StringReader(content)));<br />} catch (SAXException e) {<br />e.printStackTrace();<br />} catch (IOException e) {<br />e.printStackTrace();<br />}<br />}</p><p>public Document TransformToDocument(String content)<br />{<br />try {<br />doc=docBuilder.parse(new InputSource(new StringReader(content)));<br />} catch (SAXException e) {<br />e.printStackTrace();<br />} catch (IOException e) {<br />e.printStackTrace();<br />}<br />return doc;<br />}<br />}<br />