我正在尝试做一些我认为是基本任务的事情。
我正在寻找一个简单整洁的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元素发送到文件,DB或JMS队列中,这一切都非常容易且顺畅...但是如果万一我想使用String XML的话,这不是一件容易的事。
我非常沮丧,以至于我开始考虑编写我自己的基于SAX的解决方案可能会花费更少的精力。任何人都可以证明我错了吗?
最佳答案
很难说Smooks是否是正确的工具,因为您没有描述要解决的更广泛的问题,例如数据片段最终需要达到的位置(它确实从Smooks的值中进行添加/获取)+数据流的大小。
无论如何,如果您想使用Smooks,一种选择可能是使用DomModelCreator [1]来捕获您感兴趣的XML片段,然后使用自定义的“ Visitor” impl [2]或常规的scriptlet序列化那些DOM片段。 [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