一、四种方式的总结
【DOM】
DOM方式生成xml是基于DOM树的结构,整个DOM树会存在内存中,所以使用DOM方式可以频繁的修改xml的内容,但是因为DOM树是存在内存中的,所以对内存消耗较大。DOM方式比较适用于需要频繁删改的情况。
【SAX】
SAX方式生成xml是逐步写入的,也就是说,在SAX写入时,已经写入的部分是无法再回头修改的,因为SAX是基于事件驱动的,在写完一个标签之后是不能回头的,也因此,SAX的效率比较快,但是不能进行删改。
【JDOM】
JDOM方式不是Java提供的基本的生成xml方式,使用时需要导入额外的jar包,但是它是基于基础的API实现的。
【DOM4J】
DOM4J方式也不是Java提供的基本生成xml的方式,使用时也需要导入额外的jar包,它也是基于基础的API实现的,它功能强大,性能优异,在实际开发中经常使用。
二、四种方式的性能比较
现在想生成如下内容的xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id="1">
<name>小王子</name>
</book>
</bookstore>
使用四种不同的方式生成:
BuildXmlUtil.java
public class BuildXmlUtil {
/**
* DOM生成xml
*/
public void domToXml() {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();
document.setXmlStandalone(true);
Element bookStore = document.createElement("bookstore");
Element book = document.createElement("book");
book.setAttribute("id", "1");
Element name = document.createElement("name");
name.setTextContent("小王子");
document.appendChild(bookStore);
bookStore.appendChild(book);
book.appendChild(name);
TransformerFactory tff = TransformerFactory.newInstance();
Transformer transformer = tff.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(new DOMSource(document), new StreamResult("xml/domtest.xml"));
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}
/**
* SAX生成xml
*/
public void saxToXml() {
SAXTransformerFactory factory = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
try {
TransformerHandler handler = factory.newTransformerHandler();
Transformer transformer = handler.getTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
Result result = new StreamResult("xml/saxtest.xml");
handler.setResult(result);
AttributesImpl attr = new AttributesImpl();
handler.startDocument();
handler.startElement("", "", "bookstore", attr);
attr.clear();
attr.addAttribute("", "", "id", "", "1");
handler.startElement("", "", "book", attr);
attr.clear();
handler.startElement("", "", "name", attr);
handler.characters("小王子".toCharArray(), 0, "小王子".toCharArray().length);
handler.endElement("", "", "name");
handler.endElement("", "", "book");
handler.endElement("", "", "bookstore");
handler.endDocument();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
/**
* JDOM生成xml
*/
public void jdomToXml() {
org.jdom2.Element bookStore = new org.jdom2.Element("bookstore");
org.jdom2.Document document = new org.jdom2.Document(bookStore);
org.jdom2.Element book = new org.jdom2.Element("book");
book.setAttribute("id", "1");
bookStore.addContent(book);
org.jdom2.Element name = new org.jdom2.Element("name");
name.setText("小王子");
book.addContent(name);
Format format = Format.getPrettyFormat();
XMLOutputter out = new XMLOutputter(format);
try {
out.output(document, new FileOutputStream(new File("xml/jdomtest.xml")));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* DOM4J生成xml
*/
public void dom4jToXml() {
org.dom4j.Document document = DocumentHelper.createDocument();
org.dom4j.Element bookStore = document.addElement("bookstore");
org.dom4j.Element book= bookStore.addElement("book");
book.addAttribute("id", "1");
org.dom4j.Element name = book.addElement("name");
name.setText("小王子");
OutputFormat format = OutputFormat.createPrettyPrint();
try {
XMLWriter writer = new XMLWriter(new FileOutputStream(new File("xml/dom4jtest.xml")), format);
writer.write(document);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果(运行结果因为环境原因每次执行都可能不同,仅作参考!):
DOM:47
SAX:15
JDOM:32
DOM4J:31
从运行结果可以看出,DOM方式是最慢的,SAX方式反而是最快的,DOM4J方式仅次于SAX方式,实际开发过程中需要根据实际需要选择合适的方式。