1.DOM篇
首先是DOM的操作方法,字符串数据可以从对象中读,例如上篇提到的Person对象,这里为了方便直接手写。
1 packagecom.dom.node;2
3 importjavax.xml.parsers.DocumentBuilder;4 importjavax.xml.parsers.DocumentBuilderFactory;5 importjavax.xml.transform.OutputKeys;6 importjavax.xml.transform.Transformer;7 importjavax.xml.transform.TransformerFactory;8 importjavax.xml.transform.dom.DOMSource;9 importjavax.xml.transform.stream.StreamResult;10 importorg.w3c.dom.Document;11 importorg.w3c.dom.Element;12
13 public classDomXml {14 public static voidmain(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"?>
2
3 三国演义
4 ¥89
5 2017版
6
7
8 JavaScript高级程序设计
9 $18
10 2016
11
12
DOM方法生成的xml文件就是这样的,没有进行格式化处理。
2.DOM4J篇
操作方法:
1 packagecom.dom.node;2
3 importjava.io.FileOutputStream;4 importorg.dom4j.Document;5 importorg.dom4j.DocumentHelper;6 importorg.dom4j.Element;7 importorg.dom4j.io.OutputFormat;8 importorg.dom4j.io.XMLWriter;9
10 public classDom4JwriteXML {11 public static voidmain(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
4
5 三国演义
6 ¥89
7 2017版
8
9
10 JavaScript高级程序设计
11 $18
12 2016
13
14
还是这样看起来比较舒服吧。
总结:
我们不难看出,在XML文件的写入方法上,DOM方法要先用creatElement()方法创建节点,然后使用appendChild()
方法将节点添加到父节点,而DOM4J方法将两步做了一个综合---addElement()方法,并且在其他方面也较DOM方法
做了拓展,更重要的是性能优于DOM方法。
下面一张图就四种方法的速度方面做了对比:
SAX由于是采用事件驱动模式,对内存耗费较小,速度较快,
但是,正因为如此,SAX在对数据操作上灵活性大打折扣,
所以当下,开发者更倾向于使用DOM4J的写入方法。