Unterschied zwischen XML- und JSON-Parsing-Template

Hallo zusammen,

sehe ich das richtig, dass sich der ??-Operator beim Parsen von JSON und XML unterschiedlich verhält? Ist das so gewünscht?

Der folgende Code klappt im JSON-Parsing in einem APICall-Step.
<#if entry["Konditionale_Spalte"]??>${row.addCol("xxx",entry["Konditionale_Spalte"])}</#if>

Diese Logik in einem XMLReader läuft aber auf Fehler. Der ??-Operator ist immer wahr und das Hinzufügen der Spalte, wenn diese nicht vorhanden ist, wirft dann folgenden Fehler:

**Letzte Meldung:** *Fehler beim Parsing der 1. Datei XXX.xml. In den meisten Fällen ist die Datei leer, kaputt oder ist inhaltlich fehlerhaft, so dass Sie nicht geparst werden kann. | Fehler in XML-Parsing Code: (verantwortliche Code-Stelle: - Failed at: ${row.addCol("line_items_order_line_i... [in template "xmlToSpreadsheet" at line 10, column 48] ) | (No compatible overloaded variation was found; can't convert (unwrap) the 2nd argument to the desired Java type. The FTL type of the argument values were: string (wrapper: f.t.SimpleScalar), sequence+hash (wrapper: f.e.dom.NodeListModel). The matching overload was searched among these members: com.synesty.csvconverter.internal.spreadsheet.RowImpl.addCol(String, String), com.synesty.csvconverter.internal.spreadsheet.RowImpl.addCol(com.synesty.csvconverter.api.mapping.FieldTypeDefinition...)*

Das ist sehr unintuitiv, dass sich die beiden Hashes unterschiedlich verhalten.
Könnt ihr das anpassen? Oder was wäre der korrekte Code beim XML-Parsing für so eine Prüfung bzw. im besten Fall ein allgemein gültiger Code?

Gruß
Gustav

Hallo Gustav,

Ja, an der Stelle gibt es leider einen kleinen Unterschied im parsing Ergebnis (dem zugrunde liegenden Datenmodel) zwischen JSON und XML.

Wenn du beim XML Ergebnis entry["Konditionale_Spalte"] verwendest, wird immer eine Liste (sequence) zurückgegeben. Wenn das Element („Konditionale_Spalte“) nicht vorhanden ist, dann kommt da eine leere Liste zurück. Wenn das Element vorhanden ist, kommt als Ergebnis eine Liste mit den „Child“ Elementen. (meistens „Text“) Element.

(siehe The DOM tree - Apache FreeMarker Manual)

D.h. entry[„Konditionale_Spalte“] wird nie null sein, sodass der die Bedingung
entry["Konditionale_Spalte"]?? bei XML immer false ergibt.
In ${row.addCol("xxx",entry["Konditionale_Spalte"])} wird der Wert entry["Konditionale_Spalte"] unter der Haube in ein String umgewandelt. Wen die Liste kein Text Element enthält kommt da leider null als Ergebnis und die .addCol wirft den Fehler.

Es gibt ein paar Möglichkeiten das abzufangen. Z.B. könntest in der Bedingung prüfen, ob ein Element in der Liste vorhanden ist:

<#if entry["Konditionale_Spalte"][0]??>${row.addCol("xxx",entry["Konditionale_Spalte"])}</#if>

oder du lässt die Bedingung komplett weg und gibts bei addCol immer das 1. Element aus und packst ein ! dahinter:

${row.addCol("xxx",entry["Konditionale_Spalte"][0]!)}

Dann sollte die Spalte „leer“ sein, wenn das Element nicht vorhanden ist.

VG Torsten