【问题标题】:Apache Camel Splitter doesn't split correctly xml fileApache Camel Splitter 无法正确拆分 xml 文件
【发布时间】:2017-07-11 18:01:45
【问题描述】:

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

【问题讨论】:

标签: xml apache-camel splitter


【解决方案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>

【讨论】:

  • 是的,XML 文件是正确的...我应该在我的 XML 顶部粘贴 ""文件?如果是这样,仍然不会运行。我再次得到最后一个订单的一个文件....运行代码时发生了什么?
  • @okaisan1 我添加了我的测试用例
【解决方案2】:

拆分器 EIP 模式为每个拆分的元素生成一个新路由,如果您检查 JMS 队列(到 uri="activemq:queue:order"),您将收到每个拆分元素的消息。此外,对于拆分器中的每次迭代,您的主体都将替换为当前拆分的元素,在这种形式下,当完成拆分器时,您的主体将具有最后一个拆分的元素。

要获得一个包含所有拆分元素的主体,您需要一个聚合器 EIP 模式,它连接所有拆分元素。

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

【讨论】:

    【解决方案3】:

    请尝试以下xml模式的inheritNamespaceTagName选项

    &lt;tokenize token="order" inheritNamespaceTagName="orders" xml="true"/&gt;

    【讨论】:

      【解决方案4】:

      可能,结果文件将相互覆盖。那么这应该工作:

      <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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-06
        • 2021-11-03
        • 1970-01-01
        • 2018-12-18
        • 1970-01-01
        • 2022-08-19
        • 1970-01-01
        相关资源
        最近更新 更多