我有:
<Message>
<Header>
.....some more nodes.....
</Header>
<Element>
.....some more nodes.....
</Element>
<Element>
.....some more nodes.....
</Element>
.....more Element nodes......
</Message>
我想按节点元素拆分,但保留消息的其余部分(标题)包含在每条消息中。例如使用这个 xml 我想得到另外 2 个,它看起来像:
<Message> <!--root node is alive -->
<Header> <!--header included in every message -->
.....some more nodes.....
</Header>
<Element> <!--only one -->
.....some more nodes.....
</Element>
</Message>
使用拆分器我只能得到:
<Element>
.....some more nodes.....
</Element>
我试图使用 jaxb marshaler 来迭代 Element 节点,但由于缺少 @XmlRootElement 注释,无法将类型“java.lang.String”编组为元素,因此这个想法失败了
另外,我试图使用
.split(xpath("//Element"), new MyAgreggatorStrategy())
希望我可以自己处理消息,但是每次收到的 oldMessage 都为空。
你能分享你的想法吗。
如果我将“in”消息存储为某个属性,然后进行拆分,然后通过自定义处理器将构建我需要的所有内容,该怎么办?我希望,骆驼有更好的解决方案。谢谢
更新。现在我已经实现了这个功能,就像我之前问的那样。(将 header 存储为属性,进行拆分,恢复消息:like concatenation " + header + transformationBody +
但我必须用我的附加处理器(在拆分之前和之后)包装我的所有路线。仍然认为我的问题应该是典型和普遍的,认为我错过了一些东西。
更新2。用 1 个 splitter bean 替换了 2 个处理器
public String[] splitBody(Exchange exchange) {
String header = XPathBuilder.xpath("//Header").evaluate(exchange, String.class);
String element = XPathBuilder.xpath("//Element").evaluate(exchange, String.class);
String[] arr = element.split("</Element>");
for (int i = 0; i < arr.length; i++) {
arr[i] = "<Message>" + header + arr[i] + "</Message>";
}
return arr;
}