我有一个带有一组条目的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)。 有帮助吗? 谢谢!
答案 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