Apache Camel Splitter无法正确拆分xml文件

时间:2014-10-21 08:10:28

标签: xml apache-camel splitter

我有一个大的xml文件,并希望使用Apache Camel Splitter将其拆分为小的单个文件。因此我使用了示例的代码:

<route>
<from uri="file:inbox"/>
<split streaming="true>
<tokenize token="order" xml="true"/>
<to uri="activemq:queue:order"/>
</split>
</route>

我的xml文件看起来如此:

<orders>
<order>
<Parameter Name="CustomerID" Value="701423"/>
</order>
<order>
<Parameter Name="CustomerID" Value="7011337"/>
</order>
<order>
<Parameter Name="CustomerID" Value="701789"/>
</order>
</orders>

最后,我的分割信息如下所示:

<order>
<Parameter Name="CustomerID" Value="701789"/>
</order>

我只有一个文件,其中包含大xml文件的最后一个订单,而不是许多小的xml文件。你能告诉我有什么问题吗?非常感谢你!

4 个答案:

答案 0 :(得分:1)

您的路线适合我。

您是否完全确定,这是您正在解析的XML?或者如果它是另一个,你检查它是否有效(所有打开和关闭标签等)?

也许你可以在拆分前记录身体:

<log message="body: ${body}"/>

修改

我测试了以下路线:

<route>
    <from uri="direct:start" />
    <log message="body: ${body}"/>
    <split streaming="true">
        <tokenize token="order" xml="true"/>
        <log message="split: ${body}"/>
    </split>
</route>

调用路线:

String XML = "<orders><order><Parameter Name=\"CustomerID\" Value=\"701423\"/></order><order><Parameter Name=\"CustomerID\" Value=\"7011337\"/></order><order><Parameter Name=\"CustomerID\" Value=\"701789\"/></order></orders>";
ProducerTemplate template = main.getCamelTemplate();
template.sendBody("direct:start", XML);

这将打印以下输出:

INFO  body: <orders><order><Parameter Name="CustomerID" Value="701423"/></order><order><Parameter Name="CustomerID" Value="7011337"/></order><order><Parameter Name="CustomerID" Value="701789"/></order></orders>
INFO  split: <order><Parameter Name="CustomerID" Value="701423"/></order>
INFO  split: <order><Parameter Name="CustomerID" Value="7011337"/></order>
INFO  split: <order><Parameter Name="CustomerID" Value="701789"/></order>

答案 1 :(得分:1)

拆分器EIP模式为每个拆分的元素生成一个新路由,如果检查JMS队列(到uri =&#34; activemq:queue:order&#34;),您将为每个拆分元素发送一条消息。此外,对于分割器中的每次迭代,您的身体将被当前的分割元素替换,在此形式中,当完成分割器时,您的身体将具有最后的分割元素。

要在完成时获取包含所有分割元素的正文,您需要一个聚合器EIP模式,它连接所有分割元素。

要在分割器完成时获取原始主体,您可以将其先前保存在交换属性中,并在完成分割器时从中恢复。

答案 2 :(得分:0)

请尝试使用xml模式的inheritNamespaceTagName选项,如下所示

<tokenize token="order" inheritNamespaceTagName="orders" xml="true"/>

答案 3 :(得分:0)

可能是,结果文件会相互覆盖。然后这应该工作:

<route>
    <from uri="file:inbox" />
        <split streaming="true>
            <tokenize token=" order " xml="true" />
            <to uri="file:outbox?fileName=${file:name.noext}-${exchangeId}.${file:name.ext}" />
        </split>
</route>