1.DOM篇
首先是DOM的操作方法,字符串數據可以從對象中讀,例如上篇提到的Person對象,這里為了方便直接手寫。
1 package com.dom.node; 2 3 import javax.xml.parsers.DocumentBuilder; 4 import javax.xml.parsers.DocumentBuilderFactory; 5 import javax.xml.transform.OutputKeys; 6 import javax.xml.transform.Transformer; 7 import javax.xml.transform.TransformerFactory; 8 import javax.xml.transform.dom.DOMSource; 9 import javax.xml.transform.stream.StreamResult; 10 import org.w3c.dom.Document; 11 import org.w3c.dom.Element; 12 13 public class DomXml { 14 public static void main(String[] args) { 15 try { 16 // 第一步:創建DOM樹 17 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 18 DocumentBuilder db = dbf.newDocumentBuilder(); 19 Document document = db.newDocument(); 20 document.setXmlStandalone(true); 21 // 第二步:完善樹結構 22 // 創建節點 23 Element bookstore = document.createElement("bookstore"); 24 Element book1 = document.createElement("book"); 25 Element book2 = document.createElement("book"); 26 Element name1 = document.createElement("name"); 27 Element price1 = document.createElement("price"); 28 Element when1 = document.createElement("when"); 29 Element name2 = document.createElement("name"); 30 Element price2 = document.createElement("price"); 31 Element when2 = document.createElement("when"); 32 // 設置節點的屬性、內容 33 book1.setAttribute("from", "China"); 34 book2.setAttribute("from", "America"); 35 name1.setTextContent("三國演義"); 36 price1.setTextContent("¥89"); 37 when1.setTextContent("2017版"); 38 name2.setTextContent("JavaScript高級程序設計"); 39 price2.setTextContent("$18"); 40 when2.setTextContent("2016"); 41 // 將子節點添加到父節點 42 book1.appendChild(name1); 43 book1.appendChild(price1); 44 book1.appendChild(when1); 45 book2.appendChild(name2); 46 book2.appendChild(price2); 47 book2.appendChild(when2); 48 bookstore.appendChild(book1); 49 bookstore.appendChild(book2); 50 document.appendChild(bookstore); 51 // 第三步:將樹結構導入book.xml文件中 52 TransformerFactory tff = TransformerFactory.newInstance(); 53 Transformer tf = tff.newTransformer(); 54 tf.setOutputProperty(OutputKeys.INDENT, "yes");// 節點換行 55 tf.transform(new DOMSource(document), new StreamResult("file/book.xml")); 56 } catch (Exception e) { 57 e.printStackTrace(); 58 } 59 } 60 61 }
下面是生成的XML文件
1 <?xml version="1.0" encoding="UTF-8"?><bookstore> 2 <book from="China"> 3 <name>三國演義</name> 4 <price>¥89</price> 5 <when>2017版</when> 6 </book> 7 <book from="America"> 8 <name>JavaScript高級程序設計</name> 9 <price>$18</price> 10 <when>2016</when> 11 </book> 12 </bookstore>
DOM方法生成的xml文件就是這樣的,沒有進行格式化處理。
2.DOM4J篇
操作方法:
1 package com.dom.node; 2 3 import java.io.FileOutputStream; 4 import org.dom4j.Document; 5 import org.dom4j.DocumentHelper; 6 import org.dom4j.Element; 7 import org.dom4j.io.OutputFormat; 8 import org.dom4j.io.XMLWriter; 9 10 public class Dom4JwriteXML { 11 public static void main(String[] args) { 12 try { 13 //第一步:創建文檔對象document 14 Document document = DocumentHelper.createDocument(); 15 //第二步:由外到內添加子節點 16 Element bookstore = document.addElement("bookstore"); 17 Element book1 = bookstore.addElement("book"); 18 Element book2 = bookstore.addElement("book"); 19 Element name1 = book1.addElement("name"); 20 Element price1 = book1.addElement("price"); 21 Element when1 = book1.addElement("when"); 22 Element name2 = book2.addElement("name"); 23 Element price2 = book2.addElement("price"); 24 Element when2 = book2.addElement("when"); 25 //第三步:設置節點的屬性、內容 26 book1.addAttribute("from", "China"); 27 book2.addAttribute("from", "America"); 28 name1.setText("三國演義"); 29 price1.setText("¥89"); 30 when1.setText("2017版"); 31 name2.setText("JavaScript高級程序設計"); 32 price2.setText("$18"); 33 when2.setText("2016"); 34 //設置輸出格式 35 OutputFormat format = OutputFormat.createPrettyPrint(); 36 //設置文件編碼 37 format.setEncoding("GBK"); 38 //將寫好的文檔document輸出到指定XML文件中並關閉XMLWriter對象 39 XMLWriter xml = new XMLWriter(new FileOutputStream("file/books.xml"),format); 40 //有時候我們的內容text中會有諸如/、>之類的,我們要告訴XML,不要轉義這些字符 41 xml.setEscapeText(false); 42 xml.write(document); 43 xml.close(); 44 } catch (Exception e) { 45 e.printStackTrace(); 46 } 47 } 48 }
輸出的XML文件
1 <?xml version="1.0" encoding="GBK"?> 2 3 <bookstore> 4 <book from="China"> 5 <name>三國演義</name> 6 <price>¥89</price> 7 <when>2017版</when> 8 </book> 9 <book from="America"> 10 <name>JavaScript高級程序設計</name> 11 <price>$18</price> 12 <when>2016</when> 13 </book> 14 </bookstore>
還是這樣看起來比較舒服吧。
總結:
我們不難看出,在XML文件的寫入方法上,DOM方法要先用creatElement()方法創建節點,然后使用appendChild()
方法將節點添加到父節點,而DOM4J方法將兩步做了一個綜合---addElement()方法,並且在其他方面也較DOM方法
做了拓展,更重要的是性能優於DOM方法。
下面一張圖就四種方法的速度方面做了對比:
SAX由於是采用事件驅動模式,對內存耗費較小,速度較快,
但是,正因為如此,SAX在對數據操作上靈活性大打折扣,
所以當下,開發者更傾向於使用DOM4J的寫入方法。