我有:
<Message>
<Header>
.....some more nodes.....
</Header>
<Element>
.....some more nodes.....
</Element>
<Element>
.....some more nodes.....
</Element>
.....more Element nodes......
</Message>
我想按节点Element拆分,但保留每条消息中包含的其余消息(Header)。例如,使用这个xml我想得到另外两个,看起来像:
<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节点,但是这个想法失败的原因是:无法将类型“java.lang.String”编组为元素,因为它缺少@XmlRootElement注释
另外,我正在尝试使用
.split(xpath("//Element"), new MyAgreggatorStrategy())
希望我可以自己处理消息,但是每次收到oldMessage时我都是null。
你能分享你的想法吗?
如果我将“in”消息存储为某个属性,然后进行拆分然后通过自定义处理器将构建我需要的所有内容,该怎么办?我希望,骆驼有更好的溶解作用。 感谢
更新。现在我已经实现了这个功能,就像我之前提到的那样。 (将标题存储为属性,进行拆分,恢复消息:如串联“+ header + transformedBody +
但是我必须用我的额外处理器(在拆分之前和之后)包装我的所有路线。 Stil认为我的问题应该是典型和一般的问题,想想我错过了什么。
UPDATE2。 用1个分离器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;
}
答案 0 :(得分:2)
简单的方法是使用xslt转换xml,然后可以使用带有tokenizeXML的camel split,如.to(“xslt:”)。split()。tokenizeXML(“Message”)
XSL适用于您的情况:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<Messages>
<xsl:call-template name="Message" />
</Messages>
</xsl:template>
<xsl:template name="Message" match="/Message">
<xsl:for-each select="/Message/Element">
<Message>
<xsl:copy-of select="/Message/Header"></xsl:copy-of>
<xsl:copy-of select="."></xsl:copy-of>
</Message>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
您只需向交易所添加属性即可链接到您的标题Map。此属性将在拆分器内部可用。 像这样:
<setProperty propertyName="parentHeaders">
<simple>${headers}</simple>
</setProperty>
和内部拆分器,您可以通过键“parentHeaders”来引用标题。
希望这会对你有所帮助