关闭

Java生成xml——DOM、SAX、JDOM和DOM4J四种方式的汇总与比较

标签: javaxmlapi
309人阅读 评论(0) 收藏 举报
分类:

一、四种方式的总结

【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方式,实际开发过程中需要根据实际需要选择合适的方式。


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:30159次
    • 积分:717
    • 等级:
    • 排名:千里之外
    • 原创:42篇
    • 转载:1篇
    • 译文:0篇
    • 评论:5条
    最新评论