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

原文地址:https://www.cnblogs.com/eco-just/p/7761067.html