使用 Smooks 或其他任何元素按元素拆分 XML 文件

Split an XML file by element using Smooks or whatever

我正在尝试做一些我认为是基本任务的事情。

我正在寻求一个 简单整洁 Java 可以按元素拆分 XML 内容的解决方案。我不想将整个内容加载到内存中(即我想流式传输元素),我想掌握每个元素的字符串表示形式,以便将它发送到我想要的任何地方。

我使用 StAX 的 拉解析 显然不成功:

while(xsr.hasNext()) {
    if( xsr.next() == XMLEvent.START_ELEMENT && xsr.getLocalName().equals("Order") ) {
        String element = xsr.getElementText();
        // or String element = xsr.getText();
    }
}

我也试过 Smooks 但没有成功。特别是,此处提供的示例 http://www.smooks.org/mediawiki/index.php?title=V1.4:Smooks_v1.4_User_Guide#Basic_Splitting_and_Routing 并未提供获取元素的字符串 XML 的巧妙方法。如果您想将 XML 元素发送到文件、数据库或 JMS 队列,这一切都非常简单和顺利……但万一我想得到字符串 XML.

我非常沮丧,开始考虑编写我自己的基于 SAX 的解决方案可能更省力。谁能证明我错了?

很难判断 Smooks 是否是正确的工具,因为您没有描述您试图解决的更广泛的问题,例如数据片段最终需要到达的位置(add/take 来自 Smooks 的值)+ 数据流的大小。

无论如何,如果您想使用 Smooks,一个选择可能是使用 DomModelCreator [1] 捕获您感兴趣的 XML 片段,然后使用自定义 "Visitor" 实现 [2],或 groovy 小脚本 [3]。如果这是一个巨大的 sata 流,那么您还需要动态处理这些片段(就像在序列化之后和下一个片段之前一样)。这也可以在相同的自定义访问者 impl 或 groovy 脚本中完成,但这实际上取决于用户情况。在任何情况下,片段访问者都是您放置将在特定片段上执行的代码并执行 "whatever".

的地方

[1] http://www.smooks.org/mediawiki/index.php?title=V1.5:Smooks_v1.5_User_Guide#Mixing_DOM_and_SAX

[2]http://www.smooks.org/mediawiki/index.php?title=V1.5:Smooks_v1.5_User_Guide#Implementing_a_Fragment_Visitor

[3] http://www.smooks.org/mediawiki/index.php?title=V1.5:Smooks_v1.5_User_Guide#Scripting