Umwandlung Auftragsexport mit mehreren Artikeln in XML

Hallo,

ich exportiere Aufträge aus Plentymarkets, mappe diese und wandle sie per TextHTMLWriter und StringtoFile in eine XML Datei um, die ich auf einen FTP hochladen kann.


Zurzeit sieht die Konvertierung so aus

<?xml version="1.0" encoding="UTF-8"?>
<orders>
<#list output@SpreadsheetFilter_44.getRows() as row>
  <order>
 <irgendwelche Auftragsdaten>${row.get("irgendwelche Auftragsdaten")!}</irgendwelche Auftragsdaten>
  ....

<irgendwelche Auftragsdaten20>${row.get("irgendwelche Auftragsdaten20")!}</irgendwelche Auftragsdaten20>

--> jetzt beginnt die Aufzählung der Artikel

 <order_items>
  <order_item>
  <articleid>${row.get("articleid")!}</articleid>
  <quantity>${row.get("quantity")!}</quantity>
  </order_item>
 </order_items>
 </order>
</#list>
</orders>


Nun sollen aber alle Artikel eines Auftrages (erkennbar an der gleichen AuftragsID) innerhalb von <order_items> </order_items> NACHEINANDER INNERHALB DESSELBEN AUFTRAGS aufgelistet werden. Wie muss ich die CSV Datei abwandeln, damit das funktioniert? Im Moment wird ja jeder Artikel in eine eigene Zeile geschrieben und daher auch jede Zeile als einzelne Bestellung in der xml Datei erfasst. Was muss ich ändern?


Oder gibt es noch eine einfachere Variante?

Hallo tapeto,


das ist leider nicht ganz einfach, da man relativ viel if-else Logik verwenden muss um die richtige XML Struktur zu erhalten. Hier ein Beispiel wie es mit dem ungefilterten und ungemappten Output des PlentySearchOrders Steps funktionieren würde:


<?xml version="1.0" encoding="UTF-8"?>
<orders>
  <order>
<#list orders@PlentySearchOrders_1.getRows() as row>
<#if row.get("OrderHeadOrderTypeID")! != "">
  <#if lastOrderId! != "">
    </order_items>
  </order>
  <order>
  </#if>
  <#assign lastOrderId = row.get("OrderHeadOrderID") /><#assign itemPos = 1 />
    <irgendwelcheAuftragsdaten>${row.get("OrderHeadOrderStatus")!}</irgendwelcheAuftragsdaten>
    <irgendwelcheAuftragsdaten20>${row.get("OrderHeadOrderTypeID")!}</irgendwelcheAuftragsdaten20>
<#else>
    <#if itemPos == 1><order_items></#if>
      <order_item>
        <articleid>${row.get("OrderItemsVariantItemID")!}</articleid>
        <quantity>${row.get("OrderItemsQuantity")!}</quantity>
      </order_item>
      <#assign itemPos += 1 />
    </#if>
</#list>
    </order_items>
  <order>
</orders>



Die etwas einfachere Variante wäre, die Daten vorher in einem Datastore zu speichern (mit Parent - Variant Relation). Wenn die Daten (Bestellungen) dann aus dem SearchDatastore Step kommen, kann man relativ einfach auf die Varianten (Positionen) im TextHtmlWriter Step zugreifen (siehe https://docs.synesty.com/display/SSUD/Spreadsheets#Spreadsheets-AufVarianten-Zeilenzugreifen).


Viele Grüße

Torsten