在Apache camel路由中根据条件拆分数据

时间:2018-03-13 20:39:21

标签: xml routing apache-camel

问题陈述:我有如下XML文件:

<Orders>
    <Order>
        <OrderNo>1234</OrderNo>
        <EnterpriseCode>1</EnterpriseCode>
    </Order>
    <Order>
        <OrderNo>1234</OrderNo>
        <EnterpriseCode>2</EnterpriseCode>
    </Order>
    <Order>
        <OrderNo>1234</OrderNo>
        <EnterpriseCode>1</EnterpriseCode>
    </Order>
</Orders>

我想基于EnterpriseCode拆分数据。就像EnterpriseCode =“1”那么

<Order>
    <OrderNo>1234</OrderNo>
    <EnterpriseCode>1</EnterpriseCode>
</Order>
<Order>
    <OrderNo>1234</OrderNo>
    <EnterpriseCode>1</EnterpriseCode>
</Order>

以上结果推送到一个文件f1。

如果EnterpriseCode =“2”则

<Order>
    <OrderNo>1234</OrderNo>
    <EnterpriseCode>2</EnterpriseCode>
</Order>

推送到另一个文件f2

我希望Apache camel路由代码以XML格式解决此问题。 我尝试了以下内容:

<routes xmlns="http://camel.apache.org/schema/spring"> 
    <route id="com.trainingaccount11.Route1" autoStartup="false"> 
        <from uri="b2bmbFileSystem:com.trainingaccount11/second-input"/>
        <convertBodyTo type="java.lang.String" charset="UTF-8"/>
        <convertBodyTo type="org.w3c.dom.Document" charset="UTF-8"/>     
        <split>
            <xpath>//Order/EnterpriseCode[text()='1']</xpath>
            <setBody>
                <xpath>//Order</xpath>
            </setBody>
            <log message="${body}"/>
            <to uri="b2bmbFileSystem:com.trainingaccount11/logs5" />
        </split>
    </route> 
</routes>

但我没有得到预期的结果。

我希望此代码中的输出如下:

<Order>
    <OrderNo>1234</OrderNo>
    <EnterpriseCode>1</EnterpriseCode>
</Order>
<Order>
    <OrderNo>1234</OrderNo>
    <EnterpriseCode>1</EnterpriseCode>
</Order>

请建议我解决方案

1 个答案:

答案 0 :(得分:0)

您获得了<EnterpriseCode>元素,因为您的XPath //Order/EnterpriseCode[text()='1']正在选择它。

如果您希望XPath返回Order元素,它必须如下所示。请注意,基本xpath确定结果选择,而[...]中的查询部分定义了与所选元素“更深”的条件。

<xpath>/Orders/Order[EnterpriseCode='1']</xpath>

但是,在您的示例中,此xpath生成两个结果“行”。因此,您可能会将它们作为来自拆分器的两条消息。因为在一条消息中,结果将是无效的XML(两个Order元素将需要一个封闭的根元素。)