使用Smooks或其他方法按元素拆分XML文件

时间:2015-01-08 14:31:46

标签: java xml sax stax smooks

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

我正在使用简单而整洁的 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没有提供一种巧妙的方法来获取元素的String XML。如果你想将XML元素发送到文件,数据库或JMS队列,这一切都很简单顺利......但是如果我想了解String XML,那就不行了。

我很沮丧,以至于我开始认为编写自己的基于SAX的解决方案可能要少一些。谁能证明我错了?

1 个答案:

答案 0 :(得分:1)

很难判断Smooks是否是正确的工具,因为您并未描述您尝试解决的更广泛的问题,例如数据片段最终需要到达的位置(确实从Smooks的值中添加/取出)+数据流的大小。

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

[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