【发布时间】:2014-11-11 15:22:53
【问题描述】:
我确实阅读和测试了很多,但我没有得到一个有效的 java 解决方案:
我现在有一个通过 JAXB 处理的大型 xml 文件(超过 100MB)。目的是每次使用 root 的一个孩子将 xml 拆分为多个 xml。
重要提示:由于文件大小,首选萨克斯风格。
我找到了很多关于 xsl:result-document 的信息,但我发现无法从 java 中运行它,而且我很不确定是否可以将所需的内存保持在较低水平。
这是我的 Java 代码:
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
public class TestParse {
public static void main(final String[] args) throws Throwable {
final TransformerFactory factory = TransformerFactory.newInstance();
final Transformer transformer = factory.newTransformer(new StreamSource("D:\\split.xsl"));
final StreamSource in = new StreamSource("D:\\input.xml");
final StreamResult out = new StreamResult("D:\\output.xml");
transformer.transform(in, out);
}
这是一个示例-xml(“input.xml”):
<?xml version="1.0" encoding="ISO-8859-1"?>
<Taskname>
<Item attr="ab" attr2="c">
<MoreNodes>...</MoreNodes>
</Item>
<Item attr="xy" attr2="z">
<MoreNodes>...</MoreNodes>
</Item>
<!-- ...and many items more -->
</Taskname>
这是我的 xsl (split.xsl):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:strip-space elements="*"/>
<xsl:param name="dir" select="'file:///D://'"/>
<xsl:template match="Item">
<xsl:result-document href="{$dir}section{position()}.xml" method="xml">
<Taskname>
<xsl:copy-of select="." />
</Taskname>
</xsl:result-document>
</xsl:template>
</xsl:stylesheet>
所以一个 result-xml 应该如下所示:
<?xml version="1.0" encoding="ISO-8859-1"?>
<Taskname>
<Item attr="..." attr2="...">
<MoreNodes>...</MoreNodes>
</Item>
</Taskname>
我的问题:
我现在真的不知道,我怎样才能获得 xslt 的不同输出,除此之外,我需要将它们作为 Streams 而不是作为文件 - 我会逐项需要它们(如 sax 的 endElement)使用更少的内存。
也许,还有比使用 xslt 更好的方法,请告诉我。
【问题讨论】:
-
对于 XSLT 1.0 和 2.0,即使您使用 SAX 来解析输入 XML,XSLT 处理器也会根据语言的需要构建内存中的树表示。使用 XSLT 3.0(目前正在进行中,尽管 Saxon 9.5 和 9.6 EE 有一些支持),您可以避免构建树。
-
如果问题只是关于如何将 XSLT 2.0 功能(如
xsl:result-document)与 Java 结合使用,那么答案是使用像 Saxon 9 这样的 XSLT 2.0 处理器,作为开源版本 HE 来自我认为是 saxon.sourceforge.net 或通过 Maven。