聚合不同文件中的XML块

时间:2016-05-25 14:42:27

标签: apache-camel

我有一个带有一组条目的XML文件:

  <PurchaseOrder PurchaseOrderNumber="99503" OrderDate="1999-10-20">
    <Address Type="Shipping">
      <Name>Ellen Adams</Name>
      <Street>123 Maple Street</Street>
      <City>Mill Valley</City>
      <State>CA</State>
      <Zip>10999</Zip>
      <Country>USA</Country>
    </Address>
      <Item PartNumber="872-AA">
        <ProductName>Lawnmower</ProductName>
        <Quantity>1</Quantity>
        <USPrice>148.95</USPrice>
        <Comment>Confirm this is electric</Comment>
      </Item>
  </PurchaseOrder>
  <PurchaseOrder PurchaseOrderNumber="99505" OrderDate="1999-10-22">
    <Address Type="Shipping">
      <Name>Cristian Osorio</Name>
      <Street>456 Main Street</Street>
      <City>Buffalo</City>
      <State>NY</State>
      <Zip>98112</Zip>
      <Country>UK</Country>
    </Address>
        <Item PartNumber="456-NM">
        <ProductName>Power Supply</ProductName>
        <Quantity>1</Quantity>
        <USPrice>45.99</USPrice>
      </Item>
  </PurchaseOrder>

我的目标是将每个国家/地区的所有订单分组到不同的文件中。例如,所有美国订单都在文件us.xml中。 我已经安排了以下聚合策略

<aggregate strategyRef="myAggregationStrategy"
        completionSize="10" completionTimeout="500">
        <correlationExpression>
             <xpath>/PurchaseOrder/Address/Country/text()</xpath>
        </correlationExpression>
         <to uri="file:/home/data/other?fileName=orders.xml" />
</aggregate>

但是我不知道如何为每个组指定文件名(因为它只是最后一组条目写入文件orders.xml)。 有帮助吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

您可以从XML有效负载中获取<Country>并在交换中存储为标头,例如在聚合策略中,或者在调用聚合器之前,您可以使用setHeader

<setHeader name="country">
  <xpath>PurchaseOrder/Address/Country/text()</xpath>
</setHeader>

您可以使用它来了解它的美国,英国或它所在的国家/地区,因此也可以计算您需要的文件名。

fileName=orders-${header.country}.xml

PS关于流媒体的想法:http://camel.apache.org/why-is-my-message-body-empty.html

顺便说一句,如果您写入相同的文件名,那么Camel默认会覆盖该文件,您可以将其配置为使用fileExist=Append进行追加。请参阅文档中的更多详细信息:http://camel.apache.org/file2