首页 > 解决方案 > 优化 XML 规范化方式

问题描述

在 java 中规范化 XML 的最佳和优化方法是什么?

我们在数据库中持久化 XML,在将 XML 持久化到数据库之前,我们希望对其进行规范化、删除缩进并将整个 XML 持久化为一行,因为原始 XML 占用了大量空间。我们目前正在使用 Java 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();

标签: javaxmlperformancexml-parsing

解决方案


不要使用 Document Builder,使用StAX 或 SAX解析器。他们几乎不需要任何记忆,因为他们不建立任何模型。你得到一个元素,然后把它写出来。

考虑压缩而不是(或除此之外)空间删除和规范化。它使文档更小,缩进的常量接近于零。

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


推荐阅读