Bug in XMLReader bei mehreren Dateien

Hallo zusammen,

ich bin grade über einen Bug im XMLReader gestolpert.

Wenn man mehrere Dateien verarbeitet und in einer der letzteren Dateien noch dynamisch Spalten ergänzt (à la „Wenn Element X vorhanden, füge Spalte für X hinzu“), dann wird diese Spalte zwar ergänzt, kriegt aber keine Überschrift.

Hier ein Minimalbeispiel. Das ist vermutlich einfacher, als meine riesige Produktdatenxml zur Verfügung zu stellen.
FlowExport-Test-XMLReader_Bugbeispiel(1).json (12,3 KB)

In dem Beispiel wird die folgenden XML eingelesen.

<products>
	<product>
		<a>123a</a>
	</product>
	<product>
		<a>123b</a>
	</product>
	<product>
		<a>123c</a>
		<b>abc</b>
	</product>
</products>

Jedes Product-Element kommt in eine eigene Datei und dann werden die 3 Dateien eingelesen. Bei der dritten Datei soll dann die Spalte „b“ ergänzt werden.

Wenn man sich das Output des XMLReaders direkt ausgibt, ist die Spalte „b“ zwar vorhanden, hat aber keine Überschrift. Man kann die Spalte zwar per Freemarker unter ihrem Namen adressieren, aber in Kombination mit dem Pass-Through funktioniert es wieder nicht richtig. Kurioserweise verhalten sich die beiden Pass-Through-Modi unterschiedlich. Bei dem alten Pass Through A wird die Spalte B durchgereicht, beim Pass Through B jedoch nicht.

EDIT: Jetzt taucht die Spalte unabhängig vom Pass Through-Modus auf, nun bin ich vollends verwirrt. Ich hatte aber definitiv auch Flowruns, wo es sich wie oben beschrieben verhält. Beim Flow-Run 9bed0766-cf11-11ee-8316-901b0ea49fee wurde die Spalte verschluckt, falls euch das irgendwie hilft.
Das eigentliche Problem mit dem fehlenden Spaltennamen beim Output des XMLReader besteht weiterhin.

Gruß
Gustav

Hallo Gustav,

ich kann deine Verwirrung aufgrund des fehlenden Spaltentitels gut nachvollziehen, aber es is nicht wirklich ein Bug. Die Ursache für dieses Verhalten liegt in der „lazy“ Verarbeitung des XMLReaders bei mehreren input Dateien. Das output Spreadheet des XMLReaders wird quasi erst erzeugt, wenn es von einem Step „konsumiert“ wird. Das ist in deinem Beispiel Flow der CSVWriter Step. Die Header Zeile im 1. CSVWriter Step basiert dann auf der 1. eingelesenen XML Datei. Hier ist die Spalte „B“ nicht vorhanden.
Wenn der XMLReader einmal alle Dateien durchlaufen hat (nach dem 1. CSVWriter Step), dann ist der Titel auch im Header des Spreadsheet vorhanden/bekannt. Alle nachfolgenden Steps die das Output spreadsheet des XMLReaders verwenden (z.B. 2. CSVWriter), haben dann auch den Spaltentitel in der Kopfzeile.

(siehe auch Error in XML parsing code: No compatible overloaded variation was found)

Es gibt zwei Möglichkeiten, das Problem zu beheben:

  1. Du fügst die Spalte template des XMLReaders immer hinzu (auch wenn sie nicht vorhanden ist)
  <#if element["b"]?? && element["b"]?has_content>
    ${row.addCol("b", element["b"])}
  <#else>
    ${row.addCol("b", "")}
  </#if>

Wenn möglich, dann würde ich dir diese Variante empfehlen.

  1. Du packst hinter den XMLReader Step einen (Dummy) CSVWriter oder Mapper (mit Cache Mode aktiviert) Step, der das output Spreadsheet des XMLReader Steps verwendet.

Viele Grüße
Torsten