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

本文总结了Java中DOM、SAX、JDOM和DOM4J四种XML生成方式的特点。DOM方式内存消耗大,适合频繁修改;SAX效率高但不可修改;JDOM和DOM4J需额外库,DOM4J性能接近SAX,常用于实际开发。性能测试显示DOM最慢,SAX最快。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、四种方式的总结

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值