1.DOM篇
首先是DOM的操作方法,字符串数据可以从对象中读,例如上篇提到的Person对象,这里为了方便直接手写。
package com.dom.node; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element; public class DomXml {
public static void main(String[] args) {
try {
// 第一步:创建DOM树
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.newDocument();
document.setXmlStandalone(true);
// 第二步:完善树结构
// 创建节点
Element bookstore = document.createElement("bookstore");
Element book1 = document.createElement("book");
Element book2 = document.createElement("book");
Element name1 = document.createElement("name");
Element price1 = document.createElement("price");
Element when1 = document.createElement("when");
Element name2 = document.createElement("name");
Element price2 = document.createElement("price");
Element when2 = document.createElement("when");
// 设置节点的属性、内容
book1.setAttribute("from", "China");
book2.setAttribute("from", "America");
name1.setTextContent("三国演义");
price1.setTextContent("¥89");
when1.setTextContent("2017版");
name2.setTextContent("JavaScript高级程序设计");
price2.setTextContent("$18");
when2.setTextContent("2016");
// 将子节点添加到父节点
book1.appendChild(name1);
book1.appendChild(price1);
book1.appendChild(when1);
book2.appendChild(name2);
book2.appendChild(price2);
book2.appendChild(when2);
bookstore.appendChild(book1);
bookstore.appendChild(book2);
document.appendChild(bookstore);
// 第三步:将树结构导入book.xml文件中
TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
tf.setOutputProperty(OutputKeys.INDENT, "yes");// 节点换行
tf.transform(new DOMSource(document), new StreamResult("file/book.xml"));
} catch (Exception e) {
e.printStackTrace();
}
} }
下面是生成的XML文件
<?xml version="1.0" encoding="UTF-8"?><bookstore>
<book from="China">
<name>三国演义</name>
<price>¥89</price>
<when>2017版</when>
</book>
<book from="America">
<name>JavaScript高级程序设计</name>
<price>$18</price>
<when>2016</when>
</book>
</bookstore>
DOM方法生成的xml文件就是这样的,没有进行格式化处理。
2.DOM4J篇
操作方法:
package com.dom.node; import java.io.FileOutputStream;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter; public class Dom4JwriteXML {
public static void main(String[] args) {
try {
//第一步:创建文档对象document
Document document = DocumentHelper.createDocument();
//第二步:由外到内添加子节点
Element bookstore = document.addElement("bookstore");
Element book1 = bookstore.addElement("book");
Element book2 = bookstore.addElement("book");
Element name1 = book1.addElement("name");
Element price1 = book1.addElement("price");
Element when1 = book1.addElement("when");
Element name2 = book2.addElement("name");
Element price2 = book2.addElement("price");
Element when2 = book2.addElement("when");
//第三步:设置节点的属性、内容
book1.addAttribute("from", "China");
book2.addAttribute("from", "America");
name1.setText("三国演义");
price1.setText("¥89");
when1.setText("2017版");
name2.setText("JavaScript高级程序设计");
price2.setText("$18");
when2.setText("2016");
//设置输出格式
OutputFormat format = OutputFormat.createPrettyPrint();
//设置文件编码
format.setEncoding("GBK");
//将写好的文档document输出到指定XML文件中并关闭XMLWriter对象
XMLWriter xml = new XMLWriter(new FileOutputStream("file/books.xml"),format);
//有时候我们的内容text中会有诸如/、>之类的,我们要告诉XML,不要转义这些字符
xml.setEscapeText(false);
xml.write(document);
xml.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出的XML文件
<?xml version="1.0" encoding="GBK"?> <bookstore>
<book from="China">
<name>三国演义</name>
<price>¥89</price>
<when>2017版</when>
</book>
<book from="America">
<name>JavaScript高级程序设计</name>
<price>$18</price>
<when>2016</when>
</book>
</bookstore>
还是这样看起来比较舒服吧。
总结:
我们不难看出,在XML文件的写入方法上,DOM方法要先用creatElement()方法创建节点,然后使用appendChild()
方法将节点添加到父节点,而DOM4J方法将两步做了一个综合---addElement()方法,并且在其他方面也较DOM方法
做了拓展,更重要的是性能优于DOM方法。
下面一张图就四种方法的速度方面做了对比:
SAX由于是采用事件驱动模式,对内存耗费较小,速度较快,
但是,正因为如此,SAX在对数据操作上灵活性大打折扣,
所以当下,开发者更倾向于使用DOM4J的写入方法。