优化标准化XML的方式

时间:2018-07-27 22:18:20

标签: java xml performance xml-parsing

在Java中标准化XML的最佳方法是什么?

我们正在将XML保留在数据库中,并且在将XML保留到数据库之前,我们希望对其进行规范化,删除缩进并将整个XML保留为一行,因为原始XML占用了大量空间。当前,我们正在使用Java Document Builder来消除缩进,并且在繁重的工作量下,Document Builder占用大量内存并导致CPU过多。

我们将不同类型的XML持久化到db,我们的一些XML足够大。这是我们正在使用的示例代码段。关于如何优化它的任何建议?

ByteArrayInputStream payloadStream = new ByteArrayInputStream(payload.getBytes(XML_ENCODING));

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);

DocumentBuilder dBuilder = factory.newDocumentBuilder();
Document doc = dBuilder.parse(payloadStream);
doc.getDocumentElement().normalize();

Transformer trans = TransformerFactory.newInstance().newTransformer();
trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, STRING_YES);
trans.setOutputProperty(OutputKeys.INDENT, STRING_NO);
trans.setOutputProperty(INDENT_PROP, INDENT_AMOUNT);

StringWriter sw = new StringWriter();
trans.transform(new DOMSource(doc), new StreamResult(sw));
String xmlString = sw.toString();

2 个答案:

答案 0 :(得分:2)

不要使用文档生成器,请使用StAX or SAX解析器。他们几乎不需要任何内存,因为他们不需要构建任何模型。您得到一个元素并将其写出。

考虑压缩,而不是(或除了)空间移除和规范化。它使文档更小,并且缩进常量接近于零。

我个人认为SAX比StAX更易于使用(尽管大多数人不同意)。您可以使用this example中的几个方法扩展DefaultHandler。由于您不关心内容,因此只需将其写出来,例如使用XMLStreamWriter

答案 1 :(得分:0)

您可以运行简单的流式XSLT 3.0转换

<xsl:strip-space elements="*"/>
<xsl:mode on-no-match="deep-copy" streamable="yes"/>
<xsl:output method="xml" indent="no"/>
相关问题