java - Camel split xml 保留一些节点

标签 java apache apache-camel splitter

我有:

<Message>
    <Header>
    .....some more nodes.....
    </Header>

    <Element>
   .....some more nodes.....
    </Element>

    <Element>
   .....some more nodes.....
    </Element>
   .....more Element nodes......
</Message>

我想按节点元素拆分,但保留消息的其余部分( header )包含在每条消息中。例如,使用这个 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 编码(marshal)拆收器来迭代 Element 节点,但这个想法失败了,因为:无法将类型“java.lang.String”编码(marshal)为元素,因为它缺少 @XmlRootElement 注释

另外,我试图使用

.split(xpath("//Element"), new MyAgreggatorStrategy())

希望我能自己处理消息,但每次收到的oldMessage都是空的。

你能分享一下你的想法吗?

如果我将“in”消息存储为某些属性,然后进行拆分,然后通过自定义处理器传递将构造我需要的所有内容,该怎么办?我希望 Camel 有更好的解决方案。 谢谢

更新。现在我已经按照我之前询问的方式实现了此功能。 (将 header 存储为属性,进行分割,恢复消息:如串联“+ header + returned by TransformedBody +

但我必须用额外的处理器(分割之前和之后)包装我的所有路线。仍然认为我的问题应该是典型和普遍的问题,认为我错过了一些东西。

更新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;
}

最佳答案

简单的方法是使用 xslt 转换 xml,然后使用带有 tokenizeXML 的驼峰分割,如 .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>

关于java - Camel split xml 保留一些节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13973028/

相关文章:

javax.servlet.ServletException : java. lang.InknownClassChangeError : Found interface org. objectweb.asm.MethodVisitor,但需要类

apache - Apache 有没有办法默默地忽略无法识别的 .htaccess 指令?

Java Apache Camel XML JSON 编码创建 At-Signs

java - 如何在eclipse中添加Spark Java API(Javadoc)

java - 如何将 Java ServiveLocator 与 One-Jar 一起使用

Apache2 - 子域到端口 -> 转发

java - 在 Camel 的 SEDA 队列中保留失败的消息

java - servicemix中如何使用多个jar版本

java - 为什么我会收到 NoSuchElementException?

apache - 如何在 Apache 中设置响应超时