Java 优化XML规范化方法

Java 优化XML规范化方法,java,xml,performance,xml-parsing,Java,Xml,Performance,Xml Parsing,在java中规范化XML的最佳优化方法是什么 我们将XML持久化到数据库中,在将XML持久化到DB之前,我们希望对其进行规范化,删除缩进,并将整个XML持久化为一行,因为原始XML占用了大量空间。我们目前正在使用Java Document Builder来删除缩进,在重载情况下,Document Builder占用了大量内存并导致CPU占用率高 我们将不同类型的XML持久化到db,我们的一些XML足够大。下面是我们正在使用的示例代码段。对我们如何优化它有什么建议吗 ByteArrayInputS

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

我们将XML持久化到数据库中,在将XML持久化到DB之前,我们希望对其进行规范化,删除缩进,并将整个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();

不要使用文档生成器,使用解析器。他们几乎不需要任何内存,因为他们不构建任何模型。你得到一个元素,然后把它写出来

代替(或除)空间去除和归一化,考虑压缩。它使文档变得更小,缩进常数接近于零


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

不要使用文档生成器,请使用解析器。他们几乎不需要任何内存,因为他们不构建任何模型。你得到一个元素,然后把它写出来

代替(或除)空间去除和归一化,考虑压缩。它使文档变得更小,缩进常数接近于零


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

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

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

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

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


请格式化您的代码以使其可读。请格式化您的代码以使其可读。谢谢您的回答。将尝试使用stax。我正在寻找示例代码。如果有,请指出。谢谢你的回答。将尝试使用stax。我正在寻找示例代码。如果有,请指向它。谢谢你的评论。我们没有选择使用XSLT 3.0,而且我们还必须使用SAXON-HE。谢谢您的评论。我们没有选择使用XSLT3.0,而且我们必须使用SAXON-HE。