XML-Parser V4

Der XML-V4-Parser (Zusatzmodul) bietet signifikanten Performance-Gewinn bei extrem geringem Speicherverbrauch. Gegenüber dem XML-V3-Parser sinkt der Speicherbedarf etwa auf 10%. Bei Eingangsdateien bis etwa 100 MB sinkt die Laufzeit auf ca. 5% gegenüber Version 3. Außerdem können extrem große XML-Eingangsdaten bis maximal 250 GB geparst werden. Allerdings verlängern sich dann die Laufzeiten wegen der nötigen Plattenzugriffe wieder deutlich. Mehr dazu im Abschnitt Großes XML.

Hinweis: Wenn ein Preparser zusammen mit dem XML-V4-Parser verwendet wird, muss die Backupdatei mit dem Ergebnis des Preparsers überschrieben werden.


Einstellungsmöglichkeiten des XML-Parsers V4


Zuerst muss natürlich auf XML V4 umgestellt werden (3). Die Checkbox (1) muss gesetzt sein, da V4 immer ohne Namespaces arbeitet.


images/download/attachments/73599481/XML_9-version-1-modificationdate-1619681049534-api-v2.png



(1) Wie bereits geschrieben, dies ist immer Pflicht.

(2) Gibt den Tag-Namen (Element) an, unterhalb dessen geparst werden soll. Hier muss ein Eintrag vorgenommen werden, auch wenn die ganze XML-Struktur geparst werden soll. Ein zu parsendes Teildokument muss ebenfalls der XML-Konvention entsprechen (wohlgeformt). Hinweis: Kann auch ein XPath-1.0-Ausdruck sein, wie z. B. /inventory/books[@title="xxxx"]. Hinweis: Siehe auch Abschnitt Auswirkung eines Eintrags im Feld "XML-Tag für Datenblatt".

(3) Version 4 des XML-Parsers.

(4) Wir wollen nicht pro item ein neues Datenblatt erzeugen, sondern 2 item-Elemente, siehe (5), in ein Datenblatt gepackt. Deswegen wird unser neues Root-Element articles. Siehe Abschnitt Bildung von Chunks unten.

(5) Anzahl der item-Elemente pro Datenblatt, also pro articles, siehe (4). Siehe Abschnitt Bildung von Chunks unten.

(6) Wir haben zwei Attribute date und ref im Root-Element invoice. Diese benötigen wir im Mapping, deswegen aktivieren wir diese Checkbox und alle verfügbaren Attribute werden in articles kopiert.

(7) Die angegebenen Elemente einschließlich ihrer Kind-Elemente werden in jedes articles-Element übernommen. Alle XPath-1.0-Ausdrücke sind erlaubt. Siehe Abschnitt Attribute und Elemente in jedes Datenblatt redundant kopieren unten.

(8) Ist die XML-Datei kleiner als 2 GB, deaktivieren Sie diese Checkbox bitte. Mehr dazu unten im Abschnitt Großes XML.

Beispiel-XML


Es wird folgende XML-Datei verwendet.


<?xml version="1.0" encoding="ISO-8859-1"?>
<invoice date="07.03.13" ref="R-0001">
<header>
<customer>Lobster</customer>
<address>
<name>Lobster GmbH</name>
<street>Münchner Str. 15a</street>
<zip>82319</zip>
<city>Starnberg</city>
</address>
</header>
<positions>
<item type="1" desc="billing">
<pos>1</pos>
<article id="A-001" name="Artikel 1" price="1050" amount="1" />
<note>Vorsicht - Glas!</note>
</item>
<item type="0" desc="return">
<pos>2</pos>
<article id="A-002" name="Artikel 2" price="920" amount="2" />
</item>
<item type="1" desc="billing">
<pos>3</pos>
<article id="A-003" name="Artikel 3" price="90" amount="3" />
<note>Siehe Zählerstand</note>
</item>
</positions>
<footer>
<note code="001">Vollständig</note>
</footer>
</invoice>


Wenn wiederholte Subelemente (hier item) zu mehreren Datenblättern führen sollen, wird unter (2) nicht das reale Root-Element (invoice) des XML-Dokuments angegeben (siehe Abschnitt Auswirkung eines Eintrags im Feld "XML-Tag für Datenblatt"). Bei vorherigen Parsern (vor V4) gingen nun alle Attribute des Root-Elements und alle Eltern- oder Geschwister-Elemente, die nicht innerhalb des Elements item sind, verloren. Mit dem XML-Parser V4 können Daten aus diesen "blinden" Bereichen des XML-Dokuments in jedes Datenblatt kopiert werden, wie unten in Abschnitt Attribute und Elemente in jedes Datenblatt redundant kopieren beschrieben wird.

Bildung von Chunks


Falls die Quelldaten so aufgebaut sind, dass sehr viele kleine Datenblätter entstehen würden, weil z. B. mehrere Millionen item-Elemente vorkommen, kann die Performance dadurch ungünstig werden. In diesem Fall bietet es sich an, mehrere item-Elemente zu einem Datenblatt zusammen zu fassen. Diese Einheit von mehreren item-Elementen ist aber in dem originalen XML nicht als Struktur vorhanden. Sie kann vom Parser als virtuelles Element (hier articles) erzeugt werden, indem man in (4) einen Namen für das virtuelle Element einträgt. Dieses "Chunk"-Element erscheint dann als Root-Element, in dem mehrere item-Elemente enthalten sind.

Die Bildung von Chunks mit (4) und (5) ist optional. Wenn (4) leer bleibt, wird pro (2) ein Datenblatt erzeugt (im Beispiel pro item). Dann soll der oberste Knoten der Quellstruktur dem item-Element entsprechen.

Wenn in (4) ein virtuelles Chunk-Element benannt wird, muss in der Profil-Quellstruktur ein zusätzlicher Root-Knoten eingesetzt werden, der dem Chunk-Element (hier articles) entspricht. Dieser Knoten erhält die Satzarterkennung wie (4), um das virtuelle Chunk-Element parsen zu können.

Attribute und Elemente in jedes Datenblatt redundant kopieren


Nehmen wir an, dass wir für unsere Quelldatei, wie oben, als XML Tag für Datenblatt das Element item verwendet. Dann sind die Attribute des Elements invoice und alle Daten im Element header außerhalb des geparsten Bereiches. Ab XML Parser V4 können die Attribute des realen Root-Elements in jedes erzeugte Datenblatt übernommen werden, siehe Checkbox(6). Analog dazu kann man unter (7) jene Elemente eintragen, die real außerhalb item liegen, die aber in jedes Datenblatt übernommen werden sollen. Die erforderliche Anpassung der Profil-Quellstruktur muss gegenwärtig von Hand vorgenommen werden.

Internes XML auf Basis der vorherigen Einstellungen


Durch unsere Einstellungen sieht das Eingangs-XML intern wie folgt aus.


Datenblatt 1


<?xml version="1.0" encoding="ISO-8859-1"?>
<articles date="07.03.13" ref="R-0001">
<address>
<name>Lobster GmbH</name>
<street>Münchner Str. 15a</street>
<zip>82319</zip>
<city>Starnberg</city>
</address>
<item type="1" desc="billing">
<pos>1</pos>
<article id="A-001" name="Artikel 1" price="1050" amount="1" />
<note>Vorsicht - Glas!</note>
</item>
<item type="0" desc="return">
<pos>2</pos>
<article id="A-002" name="Artikel 2" price="920" amount="2" />
</item>
<footer>
<note code="001">Vollständig</note>
</footer>
</articles>


Datenblatt 2


<?xml version="1.0" encoding="ISO-8859-1"?>
<articles date="07.03.13" ref="R-0001">
<address>
<name>Lobster GmbH</name>
<street>Münchner Str. 15a</street>
<zip>82319</zip>
<city>Starnberg</city>
</address>
<item type="1" desc="billing">
<pos>3</pos>
<article id="A-003" name="Artikel 3" price="90" amount="3" />
<note>Siehe Zählerstand</note>
</item>
<footer>
<note code="001">Vollständig</note>
</footer>
</articles>


Und hier die passende Quell- bzw. Zielstruktur als Screenshot. Satzarterkennungen sind wie gewohnt zu definieren, werden bei einem automatischen Erzeugen der Quellstruktur aber natürlich bereits angelegt. Die Zielstruktur wurde über ein 1:1-Mapping erzeugt.


images/download/attachments/73599481/XML_12-version-1-modificationdate-1619681049559-api-v2.png

Weitere Performance-Verbesserung


Siehe Abschnitt Optionaler XPath-Filter.