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