2016-05-25 6 views
0

Ich habe eine XML-Datei mit einer Reihe von Einträgen:Aggregate XML-Blöcke in verschiedenen Dateien

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

Mein Ziel Gruppe ist alle Aufträge in verschiedenen Dateien für jedes Land. So zum Beispiel alle US-Bestellungen in einer Datei us.xml. Ich habe für die folgende Aggregationsstrategie angeordnet

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

aber ich weiß nicht, wie für jede Gruppe einen Dateinamen angeben (wie es nur die letzte Gruppe von Einträgen ist wird in der Datei Orders.xml geschrieben). Irgendwelche Hilfe? Danke!

Antwort

1

Sie können die <Country> aus der XML-Nutzlast greifen und speichern als Header auf den Austausch, zum Beispiel in der Aggregationsstrategie oder vor dem Aggregator aufrufen, können Sie setHeader verwenden:

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

Die Sie verwenden können, Um zu wissen, ob die USA, Großbritannien oder welches Land es ist, und damit auch einen Dateinamen berechnen, den Sie benötigen.

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

Und PS Meinung über Streaming: http://camel.apache.org/why-is-my-message-body-empty.html

Und btw, wenn Sie Namen in die gleiche Datei schreiben Sie dann die Datei Camel standardmäßig außer Kraft setzen, können Sie es so konfigurieren, stattdessen fileExist=Append mit anhängen. Siehe mehr Details in der Dokumentation: http://camel.apache.org/file2

+0

Ganz klar und informativ! – Carla