gpt4 book ai didi

java - 使用 SAX 在节点上运行转换

转载 作者:行者123 更新时间:2023-12-01 05:54:58 24 4
gpt4 key购买 nike

拥有一个扩展的 Java 应用程序,它可以进行大量修改,包括合并 xml 文件。这是使用 dom 类完成的,并且似乎工作得很好。最后,我想格式化生成的 xml,以便更容易读取并将其存储为字符串。一开始也用 dom 来做这件事,但它限制了我可以格式化的文件的大小。
当前代码是:

public String parseToString(Node node) {  
Transformer transformer = null;
StringBuffer buffer = null;
try {
Transformer = TransformerFactory.newInstance().new Transformer();
--- set some OutputProperties ---
StringWriter stringWriter = new StringWriter(512);
transformer.transform(new DOMSource(node), new StreamResult(stringWriter));
buffer = stringWriter.getBuffer();
stringWriter.close();
--- catch phrases ---
return(buffer.toString());
}

我的理解是,要使用 SAX,我需要将“new DOMSource()”替换为“new StreamSource()”,但要做到这一点,我需要将节点(实际上是完整的文档)转换为字符串。在不消耗更多内存的情况下最简单的方法是什么?

最佳答案

格式化你的方式时,你实际上正在做的事情是使用所谓的“身份”转换(这就是你从一个空的 Transformer())。您指定什么源类型(DOMSource 或 StreamSource)并不重要,因为 XSLT 无论如何都需要内存中的 XML(这意味着无论如何您最终都会构建 DOM)。只是不可能将 XSLT 应用于 XML 数据流,因为您的 XPath(通常)可以在源树上以任何它想要的方式徘徊。使用 SAX 输入,您无法访问未查看过的内容,然后您查看过的内容不会保留在内存中,或者会变成 DOM。

您的 XML 已作为 DOM 节点存储在内存中。恒等转换是从中获取输出流的一种方法,对于它将消耗多少内存,您无能为力(也许尝试不同的转换器实现?)。我也不确定你下面有什么解析器实现,但你可以看看它是否有类似的东西 - http://xerces.apache.org/xerces-j/apiDocs/org/apache/xml/serialize/XMLSerializer.html 。这个家伙只会沿着元素树向下移动并将它们打印出来。它不应该有内存开销,因为它所做的事情非常残酷。如果您有 SAX 输入,它会以相同的方式打印出来(即无需构建准备用于 XSLT 转换的内存中演示文稿)。采用这种方式的唯一警告是它是一个特定的 API,而不是 JAXP 的一部分。

关于java - 使用 SAX 在节点上运行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3319950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com