Mehrere Attribute im XMLReader

Hallo,

und zwar bekomme ich über einen API-Call Attribute zurück. Ich nutze dafür dann den XMLReader, um die erhalten Daten dann in einem nächsten Step zu verarbeiten. Nun habe ich aber Probleme damit.

API-Call-Response:

<ROOT><TEST name="test2"></TEST></TEST name="test2"></TEST></ROOT>

XMLReader → transformationTemplate:

<#assign row = target.addRow()>
<#list xml["ROOT"] as book>
  <#assign row = target.addRow()>
  ${addColumns(row, book)}
  <#list book.TEST as f>
    ${row.addCol("Testüberschrift", f["@name"])}
  </#list>
</#list>

Nun erhalte ich im Ergebnis meiner Tabelle nur eine weitere Spalte, anstatt 2. Denn ich habe zweimal TEST.

Ich habe die Dokumentation XML und JSON Parsing am Beispiel | Synesty Docs gelesen und verstanden, aber diesen Fall, wenn zweimal TEST als response zurück kommt, weiß ich dadurch nicht zu lösen.

Ich möchte beides entweder jedes in einer eigenen Spalte, oder auch gern mit einer Pipe oder Semmikolon in einer Spalte.

Kann jemand helfen? Gern auch Quelle zur Doku, wenn ich etwas überlesen habe.

Eine weitere Frage:

In meinem response bekomme ich relativ viele arrays (Attribute) statt strings zurück, anstatt strings, so dass ${addColumns(row, book)} meistens keinen Wert zurück gibt. Muss ich dafür dann jedes Feld einzeln mit addCol behandeln?

Hallo @Lemm,

Das sollte beides möglich sein.

Beispiel Pipe getrennte Werte in einer Spalte:

<#assign row = target.addRow()>
<#list xml["ROOT"] as book>
  <#assign row = target.addRow()>
  ${row.addCol("Testüberschrift",  book["TEST"]?map(f -> attr("name", f))?join("|"))}
</#list>

Ich habe im Beispiel mal die attr() template Funktion von uns verwendet (attr("name", f)). Die macht im Prinzip das gleiche wie f["@name"], sollte aber etwas schneller sein.

Ergebnis:

Wenn du die Werte in verschiedenen Spalte haben möchtest, dann müssen sich die Titel (1. Parameter bei row.addCol) unterscheiden. Ansonsten wird der Wert in der Zelle einfach überschrieben.

Beispiel eigene Spalten:

<#assign row = target.addRow()>
<#list xml["ROOT"] as book>
  <#assign row = target.addRow()>
  <#list book["TEST"] as f>
    ${row.addCol("Testüberschrift" + f_index,  attr("name", f)!)}
  </#list>
</#list>

Hier wird pro TEST Element an den Titel der Spalte („Testüberschrift“) der index angehängt, sodass pro element eine eigene Spalte erstellt wird.

Ergebnis:

Die Attribute können über die addColumns() Funktion leider nicht ausgegeben werden. Ich fürchte du musst den Weg über die row.addCol() Funktion gehen.

Viele Grüße
Torsten

1 „Gefällt mir“