java中對xml文檔的解析可以分爲四種方式:DOM、JDOM、SAX、DOM4J
這裏研究一下使用DOM方式進行xml文檔的寫入和解析的方法。
DOM解析XML文檔時會遍歷整個XML文檔,在內存中建立一個樹的數據結構。與JavaScript中DOM方法類似,我們可以通過getElementsByTagName方法獲取到特定的標籤對象,當然,同樣的標籤很多的話要使用List來存儲返回的多個標籤對象。另外通過DOM寫XML文檔也很方便,創建了節點之後依次連接到父節點上就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的解析和寫入。故做此博客,做學習過程中的一個小結。