java - 优化 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();
解决方案
不要使用 Document Builder,使用StAX 或 SAX解析器。他们几乎不需要任何记忆,因为他们不建立任何模型。你得到一个元素,然后把它写出来。
考虑压缩而不是(或除此之外)空间删除和规范化。它使文档更小,缩进的常量接近于零。
我个人认为 SAX 比 StAX 更易于使用(尽管大多数人不同意)。DefaultHandler
您可以使用一些方法扩展 a ,如本例中所示。由于您不关心内容,因此您只需将其写出来,例如,使用XMLStreamWriter
.
推荐阅读
- vba - LockWindowsUpdate 适用于 Office 2010 但不适用于 Office 2016
- delphi - 缩小问题。不缩小以放大图像
- swift - 内部闭包的返回值
- algorithm - 奇偶算法如何计算多边形边?
- git - 如何同步不同网络上的两个 git 存储库
- java - Java JUnit测试实现分支覆盖
- elasticsearch - ElasticSearch => 如何使用 update_by_query 更新部分文档
- php - 基于产品数量的 ACF 转发器在 Woocommerce 中生成结帐字段
- struts2 - Struts1 标签到 Struts2 标签
- bash - unix,未附加电子邮件附件