javaXML文件的寫入之DOM和DOM4J


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的寫入方法。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM