使用Java将XML拆分为多个文档

时间:2014-07-11 20:04:04

标签: java xml xslt xslt-2.0

我有大量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进入。

3 个答案:

答案 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元素,创建一个小对象树并将其编组为字符串。这会非常快。