我有大量XML文档,如下所示:
<root xmlns="urn:foo" xmlns:bar="urn:bar">
<Entity>
<bar:field>Data</bar:field>
<bar:other>Other data</bar:other>
<bar:more>More data</bar:more>
</Entity>
<Entity>
<bar:field>Data</bar:field>
<bar:other>Other data</bar:other>
<bar:more>More data</bar:more>
</Entity>
</root>
每个根节点下最多有1000个实体节点。如果可能的话,我想将其中的每一个拆分成自己的文档而不写入磁盘。
我熟悉XSLT 2.0,并且知道我可以使用xsl:result-document在Saxon中实现这一点,但是在所有情况下都写入磁盘,不是吗?有没有办法拦截输出作为字符串?我在Java工作,原始数据是REST调用的结果,因此它作为我目前写入字符串的InputStream进入。
答案 0 :(得分:1)
如何将其解析为Document,在其上运行/root/Entity
Xpath表达式,循环NodeSet,并将每个Node应用到一个新的空文档中?
答案 1 :(得分:1)
Saxon 9允许您使用http://saxonica.com/documentation/index.html#!javadoc/net.sf.saxon.lib/OutputURIResolver方法提供http://saxonica.com/documentation/index.html#!javadoc/net.sf.saxon/Controller@setOutputURIResolver,然后可以自定义方式处理任何result-document
,例如通过在内存中写入StringWriter而不是磁盘上的文件。
答案 2 :(得分:0)
您可以编写一个简单的XSLT 2.0转换,并在Java程序中对原始文件运行这么多次,并在Java程序中捕获Saxon的标准输出。
如何从Java调用另一个程序:使用ProcessBuilder并运行Process。可根据要求提供详细信息。
另一种选择是使用JAXB创建对象树,提取Entity元素,创建一个小对象树并将其编组为字符串。这会非常快。