===== XML-Daten verarbeiten =====
==== Anforderung ====
Beim Einsatz von Standardsoftware (z.B. //Microsoft Dynamics NAV//) kommt immer wieder die Frage auf, ob (p2f) nicht direkt **XML-Dateien** verarbeiten kann. Die Schwierigkeit dabei ist zum einen, daß XML-Dateien für gewöhnlich nicht gedruckt, sondern lediglich in irgendwelchen Verzeichnissen abgelegt werden.
Hinzu kommt, daß XML eine sehr dynamische Strukturierung der Daten erlaubt. Einzelne Tags können existieren oder auch nicht, Tags können leer sein, Tags können beliebig gruppiert werden und die Reihenfolge ist im Prinzip beliebig.
\\
\\
==== Realisierung ====
Daß die XML-Daten nur als Datei angeliefert werden, ist für (p2f) kein Problem, weil mit dem **Monitor-Gateway** eine Komponente existiert, die genau für diese Anforderung eingesetzt werden kann. Ein Monitor-Gateway überwacht bis zu 250 Verzeichnisse, deren Namen mit denen von Clients oder Gateways übereinstimmen. Wird nun in eines der überwachten Verzeichnisse eine Datei kopiert, wird diese so bald als möglich an den zugehörigen Client oder an das zugehörige Gateway übertragen.
Der Zeitpunkt der Übertragung hängt davon ab, ob die kopierte Datei bereits vollständig ist (vom Erzeuger geschlossen) und ob der Client oder das Gateway verfügbar ist. Verfügbar heist hier, der Client oder das Gateway ist gestartet und mit keiner anderen Aufgabe beschäftigt.
Die Erkennung der einzelnen XML-Tags wurde in (p2f) bisher durch entsprechend formulierte reguläre Ausdrücke realisiert, ist aber mit dem p2fClient Build 5788 und dem p2fGate Build 3065 radikal vereinfacht worden. Jetzt kann statt einem Feldindex einfach ein Tag-Name angegeben werden, auf dessen Inhalt sich die entsprechende Aktion von (p2f) beziehen soll.\\
\\
==== XML-Daten ====
Sollen XML-Dateien als Eingangsdatenstrom für (p2f) genutzt werden, sind ein paar Randbedingungen einzuhalten, da ansonsten der (p2f)-Client oder -Gateway die Daten nicht korrekt auswerten kann:
* XML-Tags dürfen in (p2f) keine mehrzeilige Inhalte haben. Solche Tags können aktuell nicht von (p2f) ausgewertet werden.
* (p2f) erfordert eineindeutige Tag-Namen. Das bedeutet insbesondere, daß in Gruppen nicht wieder die gleichen Tag-Namen auftauchen dürfen, wie auf der übergeordneten Ebene. Es ist auch nicht zulässig, Tags die zur Gruppierung dienen, den gleichen Namen zu geben wie Tags mit Werten. Gleichnamige Tags in Wiederholungsgruppen sind allerdings zulässig.
* Die Daten können mit entsprechenden Tags beliebig gruppiert werden. Diese Gruppierung ist aber für (p2f) ohne Bedeutung. Lediglich im Falle von Wiederholungsgruppen ist die Gruppierung relevant, wird aber nicht vom Client oder Gateway ausgewertet, sondern in einem vorgeschalteten Prozess des Monitor-Gateways berücksichtigt. (siehe [[print2forms:tips:tip66|XML-Daten für Etiketten]])
* Das Encoding der XML-Datei wird aktuell nicht ausgewertet. Dateien mit entsprechender BOM werden als Unicode interpretiert, alle anderen als ISO-8859-1.
* Eine eventuell in der XML-Datei enthaltene Referenz auf eine DTD wird nicht ausgewertet.
Ein einfaches Beispiel für eine durch (p2f) zu bearbeitende XML-Datei:
\\
Muster GmbH
Hauptstrasse 21
23456
Musterstadt
28.0941
AB160333
\\
==== XML-Daten in einer Ressource ====
{{print2forms:tips:0063-3.png}}
Bei den (p2f)-Ressourcen können XML-Tags im Rahmen der Definition von Vorlagen zum Einsatz kommen. Vorlagen werden in der Regel mit dem **Import-Filter** erstellt, der zu diesem Zweck ebenfalls entsprechend erweitert wurde (siehe [[print2forms:tips:tip64|XML-Daten in Ressourcen]]).\\
\\
Um einem Platzhalter innerhalb der Vorlage XML-Daten zuzuweisen, wird jetzt einfach der Name des Tags unter **Feldindex / Tag** angegeben.\\
\\
Damit man noch die Möglichkeit hat, selbst zu entscheiden, ob man den gesamten Inhalt des Tags oder nur einen Teil davon verwenden möchte, kann unter **Auswahlmuster** noch ein regulärer Ausdruck angegeben werden, der auf den Inhalt des Tags angewendet wird. Dabei wird wie üblich nur der erste Puffer statt des Platzhalters in die Vorlage übernommen. Wird kein **Auswahlmuster** angegeben, wird automatisch ''(.*)'' angenommen.
\\
==== XML-Daten in einem Formular ====
Ganz analog erfolgt die Verwendung von XML-Daten innerhalb von Feldern eines Formulars. Der Name des Tags wird einfach unter **Feldindex / Bedingung / Tag** angegeben. Das **Vergleichsmuster** bestimmt, welcher Teil des Inhals des Tags Beachtung finden soll.\\
\\
Im Gegensatz zum Einsatz von XML-Daten innerhalb von Vorlagen können innerhalb des regulären Ausdrucks allerdings alle zehn Puffer angesprochen und verwendet werden.\\
\\
\\
{{print2forms:tips:0063-1.png}}
{{print2forms:tips:0063-2.png}}\\
\\
Bei der Nutzung von XML-Daten in Formularen gibt es noch einen weiteren Einsatzzweck, nämlich innerhalb der Bedingungen zum Einbinden von untergeordneten Formularen.\\
\\
Auch hier wird der Name des Tags wird einfach unter **Feldindex / Bedingung / Tag** angegeben. Das **Vergleichsmuster** bestimmt, welcher Teil des Inhals des Tags Beachtung finden soll.\\
\\
Ein Sonderfall ist der, daß nur getestet werden soll, ob ein bestimmtes Tag innerhalb der Nutzdaten überhaupt vorkommt. Für einen solchen Test wird unter **Vergleichsmuster** kein Wert eingegeben.\\
\\
Mit der Einstellung unter **Vergleich** kann dann ausgewählt werden, ob das Tag vorkommen muß (Einstellung **ist gleich**) oder aber nicht vorkommen darf (Einstellung **ist ungleich**).
\\
==== XML-Daten in einem Prozess ====
Innerhalb von Prozessen können XML-Tags innerhalb der Bearbeitungsschritte eines Dokumentenprozesses verwendet werden, um die Bedingungen für die Ausführung des Bearbeitungsschritts zu formulieren.\\
\\
Unter **Feldindex / Tag** wird einfach der Name des zu prüfenden Tags eingegeben. Damit man noch die Möglichkeit hat, selbst zu entscheiden, ob man den gesamten Inhalt des Tags oder nur einen Teil davon verwenden möchte, kann unter **Vergleichswert** noch ein regulärer Ausdruck angegeben werden, der auf den Inhalt des Tags angewendet wird. Die dabei aufgesammelten Puffer können wie üblich unter dem Namen der Bedingung in Formularen ausgewertet werden.\\
\\
Im Beispiel links ist nur die erste Bedingung wirklich eine Bedingung. Da unter **Verknüpfung** nichts angegeben ist, werden die Angaben unter ''CompanyAddress'' lediglich ausgewertet, um später auf die Puffer des regulären Ausdrucks zugreifen zu können.
{{print2forms:tips:0063-4.png}}
\\
==== Hinweise ====
* Für den Import von Vorlagen gibt es weitere Informationen unter [[print2forms:tips:tip64|XML-Daten in Ressourcen]]. Dort wird erklärt, wie XML-Daten mit Platzhaltern innerhalb der Ressource verknüpft werden können.
* Für die Bearbeitung von Wiederholungsgruppen innerhalb der XML-Datei (z.B. für Listen oder für Etikettenbögen) gibt es weitere Informationen unter [[print2forms:tips:tip65|XML-Daten in Etiketten]]. Dort wird erklärt, wie XML-Daten im Vorfeld aufbereitet werden, um die Wiederholungsgruppen bearbeiten zu können.
* Intern werden die XML-Daten nicht mit den für deren Verarbeitung bereitgestellten Funktionen der Laufzeitumgebung bearbeitet und es wird auch kein DOM erzeugt. Damit (p2f) auf sehr große XML-Dateien bearbeiten kann, so wie sie etwa für Batch-Jobs typisch sind, wird die XML-Datei zeilenweise interpretiert und textuell (mit regulären Ausdrücken) ausgewertet. Das hat auch den Vorteil, daß der Druck unmittelbar beginnen kann, selbst wenn noch nicht die ganze Datei analysiert ist.