我有一个大的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文件。你能告诉我有什么问题吗?非常感谢你!
答案 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>