Java 使用SAX在节点上运行转换
有一个扩展的Java应用程序,它可以做很多修改,包括合并xml文件。这是使用dom类完成的,似乎工作得很好。最后,我想格式化生成的xml,使其更易于读取并存储为字符串。开始时,dom也是这样做的,但它限制了我可以格式化的文件的大小。Java 使用SAX在节点上运行转换,java,xml,sax,Java,Xml,Sax,有一个扩展的Java应用程序,它可以做很多修改,包括合并xml文件。这是使用dom类完成的,似乎工作得很好。最后,我想格式化生成的xml,使其更易于读取并存储为字符串。开始时,dom也是这样做的,但它限制了我可以格式化的文件的大小。 目前的代码是: public String parseToString(Node node) { Transformer transformer = null; StringBuffer buffer = null; try {
目前的代码是:
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()”,但要做到这一点,我需要将节点(实际上是完整的文档)转换为字符串。在不占用更多内存的情况下,最简单的方法是什么?格式化方式时,您实际要做的是使用所谓的“标识”转换(即从空转换器()获得的转换)转换XML(DOM节点)。您指定的源类型(DOMSource或StreamSource)实际上并不重要,因为XSLT无论如何都需要内存中的XML(这意味着您无论如何都要构建DOM)。由于XPath(通常)可以在源代码树上随意移动,所以不可能将XSLT应用于XML数据流。使用SAX输入,您无法访问您未查看的内容,然后您所查看的内容将无法保留在内存中,或者成为DOM 内存中已经有XML作为DOM节点。身份转换是从中获取输出流的一种方法,对于它将消耗多少内存,您无能为力(可能尝试不同的transformer实现?)。我也不确定下面有什么解析器实现,但您可以看看它是否有这样的东西-。这家伙只需沿着元素树向下移动并打印出来。它应该没有内存开销,因为它所做的是相当残酷的。如果您有一个SAX输入,它将以相同的方式打印出来(也就是说,无需构建一个准备好XSLT转换的内存中表示)。这样做的唯一警告是,它是一个特定的API,而不是JAXP的一部分