Datenauswahl aus XML-Dateien.
Mit Hilfe des Modules kann auf Daten zugriffen werden, die in XML-Dateien definiert sind.
Die Funktionen des Moduls xmlquery dienen der Unterstützung der gleichnamigen Abfragesprache xmlquery zur einfachen Bearbeitung von XML-Dateien. Vor der Ausführung einer xmlquery-Anweisung werden alle in der Anweisung enthaltenen Tags der aktuellen Anweisungsumgebung und alle Funktionsvariablen durch ihre aktuellen Werte ersetzt.
Wichtiger Hinweis: xmlquery benötigt zur Auswertung von where-Bedingungen eine vollständig definierte XML-Struktur. Fehlende Elemente und Attribute können mit dummy-Definitionen in den xentities definiert werden.
Die xmlquery Abfragesprache hat die folgenden Schlüsselwörter:
Mit Hilfe des Programmes xmlquery können Sie XML-Query-Anweisungen testen.
Als Bezeichner für die Datenspalten werden die Elementnamen und Attribute der XML-Datei verwendet. Für die Namen von Elementen und Attributen gelten die für XML gültigen Regeln:
Enthalten die Namen andere Zeichen als Buchstaben, Zahlen, Underscore (_) oder Doppelpunkt (:), müssen die Spaltenname einzeln in Accent Graves (z.B. `namespace.name`) eingeschlossen werden.
Gegeben sei folgende kleine XML-Datei:
<pp.adrässe⸗1>
<pp.förma>
<pp.büro tür='12' >A 1</pp.büro>
</pp.förma>
<pp.förma>
<pp.büro tür='13' >A 2</pp.büro>
</pp.förma>
<pp.förma>
<pp.büro tür='14' >WERK II</pp.büro>
</pp.förma>
</pp.adrässe⸗1>
Dann können mit folgender Anweisung alle Adressen ermittelt werden, deren Büroadresse mit A beginnen. Beachten Sie
bitte auch, dass das Attribut tür keine Anführungszeichen benötigt (aber natürlich haben darf).
select `pp.büro`, `pp.büro`.tür node `pp.adrässe⸗1`.`pp.förma` where `pp.büro` like 'A%'
Elementpfade werden aus den durch Punkte (.) getrennten Elementnamen zusammengesetzt. (Einer der Gründe für die `-Anführungszeichen, wenn ein Name einen Punkt enthält.)
Verweis auf die ID eines Unterobjektes
productdata.object.sub.id
[Ab v4.2 R32300] Mit dem Elementnamen child_N (mit N = {0, 1, ...}) können Sie auf das (0-basierte) n-te Unterelement eines Elementes zugreifen. Der Name des Unterelementes wird dabei ignoriert. Bitte beachten Sie, dass Attribute wie Elemente gezählt werden!
Verweis auf die ID des vierten Unterobjektes
productdata.child_3.id
Im Beispiel zeigt row.child_0 auf das Attribut row.num und row.child_3.name ist 'B'.
<row ⓪ num="2" ① id="1"> ② <col name="A" num="1" id="0"> <format></format> <value>Government</value> <text>Government</text> </col> ③ <col name="B" num="2" id="1"> <format></format> <value>Canada</value> <text>Canada</text> </col> ...
Auf übergeordnete Elemente kann mit .. zugegriffen werden. Drei Punkte bezeichnet zwei Ebenen weiter oben usw.. Die Mehrfachpunkte sind nur am Beginn eines Spaltennamens erlaubt.
Zugriff auf das Objekt aus der Ebene \span[src]{sub
..sub
In where-Bedignungen wird . (Punkt) durch den eigenen Inhalt ersetzt.
Gegeben ist folgende XML-Struktur:
<offer> <stylepromotion comet_id="228056984"> <productpanelname>Badmöbel "Elias"</productpanelname> <text keyname="PROMOTION_TEXT_PRINT">...</text> <text keyname="SHORT_DESCRIPTION">Badmöbel "Elias"</text> <text keyname="MATERIALDESC_FOR_STYLE">Kiefer</text> <keyattribute no="1" displayname="Möbeltyp">A_FURNITURE_TYPE</keyattribute> <keyattribute no="2" displayname="Farbe">A_COLOR</keyattribute> </stylepromotion> </offer>
Mit folgender Anweisung kann der Displayname eines bestimmten keyattribute erfragt werden, für A_FURNITURE_TYPE der Werbung mit der ID 228056984 also "Möbeltyp".
xmlget displayname node offer.stylepromotion where comet_id = 228056984 node keyattribute where . = "A_FURNITURE_TYPE"
Im Normalfall kann auf eine Unterscheidung von Attributen und Elementen verzichtet werden. Nur wenn es Attribute mit dem gleichen Namen wie direkte UnterElemente gibt, muss eine Unterscheidung gemacht werden. Dem Attributnamen wird dafür ein @ (wie Attribut) vorangestellt. Elemente werden mit $ gekennzeichnet. Fehlt die Kennzeichnung, werden die Attribute verwendet.
Unterscheidung der ids eines Objektes
@id $id
CDATA-Blöcke in den XML-Dateien werden berücksichtigt und beim Schreiben der Dateien wiederhergestellt. Soll ein Element-Wert mit Hilfe von CDATA definiert werden, können die Methoden xmlquery::send_cdata_begin und send_cdata_end oder xmlquery::input mit der Typdefinition kCDATA verwendet werden. Innerhalb von CDATA-Blöcken darf der String ![[[CDATA[ nicht verwendet werden.
Die folgende Sprachbeschreibung erfolgt in sog. EBNF-Syntax. Eine kurze Beschreibung dazu finden Sie hier.
Anweisungen beginnen mit der (optionalen) Definition der Funktionsvariablen. Danach wird zwingend die XML-Datei erwartet, auf der die Anweisung ausgeführt werden soll. Schließlich folgt die eigentliche Anweisung:
Als Dateidefinition wird ein vollständiger Pfad zur XML-Datei erwartet. Der Pfad darf mit einem definierten Alias beginnen. In XML-Offline Datenverbindungen werden unvollständige Pfade zudem relativ zum Datenordner aufgelöst.
Selects beginnen mit einem der beiden (gleichwertigen) Schlüsselwörter select oder xmlget. Danach folgt die Liste der Ergebnisspalten. Optional kann die Ergebnisliste durch eine vorangestellte distinct-Definition auf eindeutige Ergebnisse reduziert werden. Nach der Festlegung der Ergebnisse geben Sie die XML-Elemente an, in den gesucht werden soll. Die Suche startet immer im Root-Element der gegebenen XML-Datei. Mit einer orderby-Definition können die Ergebnisse zum Schluß sortiert werden.
Mit Hilfe des Schlüsselwortes distinct können die Ergebnisspalten von select bzw. xmlget auf eindeutige Ergebnisse resuziert werden. Fügen Sie dazu zwischen select und dem ersten Spaltennamen eine der folgenden Angaben ein:
Hier einige Beipiele:
select distinct id, num, substr (t.value, 3, -1), ... // Eindeutig in [id, num, t.value] select distinct (t.value) id, num, substr (t.value, 3, -1), ... // Eindeutig in [t.value] select distinct (t.value, num) id, num, substr (t.value, 3, -1), ... // Eindeutig in [t.value, num] select distinct (t.value, num, abc.def) id, num, substr (t.value, 3, -1), ... // Die fehlende Spalte abc.def wird ignoriert
Als Ergebnisse eines Selects geben Sie eine komma-getrennte Liste von Elementpfaden und konstanten Werten (Zahlen und Strings) an. Die Ergebnisse können zuätzlich mit Funktionen oder einfachen Operatoren bearbeitet werden:
Die Elementpfade beginnen immer beim letzten Element der node-Selektoren. Darüberliegene Elternwerte können mit der Punkt-Notation erreicht werden.
Als Werte sind Elementpfade und Konstaneten (Ganzzahlen, Kommazahlen und Strings) erlaubt. Elementpfade beginnen beim letzten Element der node-Selektoren. Darüberliegene Elternwerte können mit der Punkt-Notation erreicht werden. In Kommazahlen werden Punkt (.) und Komma (,) als Dezimaltrenner akzeptiert.
In den Rückgabespalten dürfen einfache Berechnungen gemacht werden. Die Formeln dürfen Spaltennamen enthalten, deren aktuelle Werte vor jeder Berechnung eingesetzt werden. Erlaubt sind die folgenden Operatoren :
Klammerungen sind bisher nicht vorgesehen. Um zwischen Vorzeichen und Operatoren unterscheiden zu können, muss zwischen + bzw. - und dem folgenden Wert ein Leerzeichen stehen. Die Bearbeitung der Formeln geschieht strikt von links nach rechts, alle Operatoren haben die selbe Wertigkeit. Wenn möglich, werden Ergebnisse als Ganzzahlen dargestellt. Hier einige Beispiele:
1 + 2 * 3 = 9 // und nicht 7 1.1 + 1.8 = 2.900000 // aber 1.1+1.9 = 3 (ohne Nachkommastellen) 2 * id || name = "24Name" // mit id=12 und name="Name" 2 * id || name + 3.1 = 27.1 // mit id=12 und name="Name", name ist nicht in Zahl konvertierbar, also gleich 0
Zur Berechnung von Strings stehen die folgenden Funktionen zur Verfügung :
Die selben Funktionen sind auch zur Berechnung der Tags der Anweisungsumgebung erlaubt.
substr (name, 10, -1) token (name, 1, ".")
Hat ein Element oder Attribut ihrer XML-Datei einen der oben angegebenen Funktionsnamen, muß dieser Name im Aufruf in Accent Graves (`..`) eingeschlossen werden, statt select filename node ... also select `filename` node ... .
node-Selektoren bestimmen die Auswahl der XML-Elemente, in denen die Anweisung suchen soll. Sie bestehen jeweils aus einem Elementpfad und einer where-Bedingung.
Die Auswertung beginnt immer beim Root-Element der XML-Struktur und die node-Selektoren müssen insgesamt einen einen durchgängigen Elementpfad beschreiben. Der erste Selector beginnt also immer beim Root-Element der XML-Srtuktur. Weitere node-Selektoren können den Elementpfad fortsetzen.
Die Ergebnisspalten setzen beim letzten Element der node-Selektoren auf.
Gegeben ist folgende XML-Struktur:
<offer> <stylepromotion comet_id="228056984"> <productpanelname>Badmöbel "Elias"</productpanelname> <text keyname="PROMOTION_TEXT_PRINT">...</text> <text keyname="SHORT_DESCRIPTION">Badmöbel "Elias"</text> <text keyname="MATERIALDESC_FOR_STYLE">Kiefer</text> <keyattribute no="1" displayname="Möbeltyp">A_FURNITURE_TYPE</keyattribute> <keyattribute no="2" displayname="Farbe">A_COLOR</keyattribute> </stylepromotion> </offer>
Mit folgender Anweisung kann der Displayname eines bestimmten keyattribute erfragt werden, für A_FURNITURE_TYPE der Werbung mit der ID 228056984 also "Möbeltyp".
xmlget displayname node offer.stylepromotion where comet_id = 228056984 node keyattribute where . = "A_FURNITURE_TYPE"
Wichtiger Hinweis: xmlquery benötigt zur Auswertung von where-Bedingungen eine vollständig definierte XML-Struktur. Fehlende Elemente und Attribute können mit dummy-Definitionen in den xentities definiert werden.
Mit Bedingungen kann die Menge der Elemente auf der Ebene jedes node-Selektors eingeschränkt werden. Bedingungen können mit and und or verknüpft und geklammert werden. Auf der linken Seite der Vergleiche sind Funtionen erlaubt:
and and or haben die allgemein Bindung and vor or, A || B && C bedeutet also A || (B && C)
Das Ergebnis einer Bedingung wird durch den jeweiligen Vergleichsoperator bestimmt. Dabei gilt:
Bezeichner, die auf id oder sequencenr (case insensitive) enden oder mit id beginnen und an dritter Stelle eine Zahl haben (etwa id2 oder id2Xid3) erwarten als Vergleichswerte Ganzzahlen. Mit Hilfe der Konfigurationsdatei xentities.xml kann der Datentyp von Elementen speziell festgelegt werden, mehr dazu siehe hier.
Am Schluß des Befehls kann ein orderby folgen. Dahinter stehen ein oder mehrere, durch Komma getrennte Elementpfaden. Erlaubt sind nur Elementpfaden, die auch in den Ergebnisspalten vorkommen. Es dürfen bis zu 10 Sortierfelder angegeben werden:
Sortiert wird nach folgenden Kriterien:
Das Beispiel zeigt einen einfachen Select-Befehl, der die Namen und SubIDs aller Produktdaten ausgibt, deren SubID = 1002 ist.
select name, sub.id node productdata.object where id > 0 and sub.id = 1002;
Der Befehl entspricht ein seiner Syntax dem Befehl xmlget mit dem Unterschied, dass hinter jeder Ergebnisspalte ein durch '=' getrennter neuer Wert steht. Als Werte sind nur direkte Zuweisungen erlaubt. Zuweisungen der Art id = id+1 sind nicht implementiert. Änderungen müssen mit commit bestätigt werden.
Das Beispiel zeigt einen einfachen Update-Befehl beim Name und SubID aller Elemente mit der SubID 1002 geändert werden.
update name="Hallo Hallo", sub.id=33333 node productdata.object where id > 0 and sub.id = 1002;
Der Befehl entspricht ein seiner Syntax dem Befehl xmlget mit dem Unterschied, dass hinter jeder Ergebnisspalte ein durch '=' getrennter neuer Wert steht. Von jedem gefundenen Element wird eine Kopie angelegt, und in die bestehende Struktur eingefügt. Soll genau ein Datensatz eingefügt werden, muss die where-Bedingung so gestellt sein, dass genau ein Datensatz ausgewählt wird, also etwa where id = 0. Ist die Kopie eingefügt, werden die angegebenen Spalten mit den Werten des Inserts gefüllt. Neue Elemente können nur in Dateien eingefügt werden, die mindestens ein Element der gewünschten Struktur enthalten. Änderungen müssen mit commit bestätigt werden.
Das Beispiel macht von allen Produktdaten, die Unterprodukte der id 1002 enthalten, eine Kopie, fügt die Kopie an die bestehenden Produktdaten an und ändert die Namen und UnterIDs der neuen Produktdaten.
insert name="Hallo Hallo", sub.id=33333 node productdata.object where id > 0 and sub.id = 1002;
Der Befehl entspricht ein seiner Syntax dem Befehl xmlget mit dem Unterschied, dass keine Ergebnisspalten angegeben werden.. Änderungen müssen mit commit bestätigt werden.
Lösche alle Produktdaten, die Unterprodukte mit der id 1002 enthalten.
delete node productdata.object where id > 0 and sub.id = 1002;
Mit commit werden alle Änderungen in die XML Datei zurückgeschrieben. Nach commit sind Änderungen nicht mehr rückgängig zu machen.
Optimierungen können für definierte Zieldateien gemacht werden, in denen sie gelten sollen. Für alle Pfadangaben in den Optimierungen gilt:
Durch das Anlegen eines Indexes kann die Bearbeitung von xmlqueries um das 20-fache beschleunigt werden. Die Definition eines Indexes ist den folgenden Fällen sinnvoll:
In den drei folgenden Beispielen für where-Bedingungen kann auf name kein Index angewendet werden:
Indexe werden in der Datei xindex.xml im XML-Datenordner definiert und haben folgendes Format:
<indicees> <index> <file>...</file> <nodepath>...</nodepath> <unique>no</unique> <!-- yes | no --> <enabled>yes</enabled> <!-- yes | no --> </index> </indicees>
Mit file wird festgelegt in welchen Dateien der Index angewendet werden soll.
In nodepath wird der vollständige XML-Pfad des zu indizierenden Attributes angebenen. Pfadtrenner ist der Punkt (.).
Das Attribut unique definiert, ob ein Index eindeutige Werte enthält (yes) oder nicht (no). Bei eindeutigen Indexen können wir das erste gefundene Objekt verwenden. Bei nicht-eindeutigen Indexen werden alle Elemente gleichen Inhaltes in die Auswahl aufgenommen.
Mit enabled kann der Index abgeschaltet werden. Erlaubt sind die Werte yes und no.
Das Beispiel zeigt eine Index-Datei.
<?xml version="1.0"?> <indicees>
<!-- Standardindexe --> <index> <file>panelstatements.xml</file> <nodepath>panelstatements.panelstatement.id</nodepath> <unique>yes</unique> <enabled>yes</enabled> </index> <index> <file>actions.xml</file> <nodepath>actions.action.classid</nodepath> <unique>no</unique> <enabled>yes</enabled> </index> <index> <file>pageitems.xml</file> <nodepath>pageitems.pageitem.id</nodepath> <unique>yes</unique> <enabled>yes</enabled> </index>
<!-- Info_6-stellige-Zahl_id.xml --> <index> <file>Info_[0-9]{6}_id.xml</file> <nodepath>Publication.ProductGroup.Product.ProductID</nodepath> <unique>yes</unique> <enabled>yes</enabled> </index> <index> <file>Info_[0-9]{6}_id.xml</file> <nodepath>Publication.ProductGroup.Product.ProductGroupID</nodepath> <unique>no</unique> <enabled>yes</enabled> </index>
</indicees>
In der Datei xentities.xml können spezielle Importsteuerungen festgelegt werden. Folgende Steuerungsarten sind definiert:
<?xml version="1.0"?> <entities>
</entities>
Texte können Formatierungsanweisungen enthalten die in HTML oder InDesign®-TaggedText angegeben sind, etwa <B>Mein Text</B>. Der XML-Parser würde diesen Text als Unterknoten des aktuellen Knotens interpretieren und ihm den Inhalt Mein Text geben. Um solche Fehlinterpretationen zu vermeiden, können vor dem Einlesen der Datei Inhalte ersetzt werden. Die Ersetzungen können auf einzelne Dateien beschränkt werden.
Achten Sie bei der Definition vorbereitender Ersetzungen darauf, dass keine gültigen XML-Tags der Datei ersetzt werden. Oder, noch besser, versuchen sie bei der Definition der XML-DTD auf Elementnamen zu verzichten, die in HTML oder InDesign®-TaggedText gebräuchlich sind (wie etwa <H1>, <TABLE> oder <P>)
<prereplace> <file></file> <search><b></search> <replace><cFont:Verdana></replace> </prereplace>
Soll diese Ersetzung nur in der mit MYFILE bezeichneten Datendatei angewendet werden, kann die folgende Definition verwendet werden.
<prereplace> <file>$MYFILE</file> <search><b></search> <replace><cFont:Verdana></replace> </prereplace>
Ersetzen definierter Textteile durch andere, z.B. Ersetzen von HTML-typischen Zeilentrennern (<BR>) durch InDesign®-Zeilentrenner. Die Ersetzungen werden direkt beim Einlesen der XML-Dateien gemacht. Die Definition der Ersetzungen kann auf einzelne Dateien eingeschänkt werden. Als Dateipfade können die in der Palette Einstellungen definierten Aliasnamen verwendet werden.
Die folgenden Schlüsselwörter werden im Ersetzen-String replace automatisch durch ihre aktuellen Werte ersetzt :
Das folgende Beispiel beschreibt die Definition, die nötig ist, um alle Auftreten von AAAA zu ersetzen.
<entity> <file></file> <search>AAAA</search> <replace>Mein Name</replace> </entity>
Um in der mit MYFILE bezeichneten Datendatei den Namen der aktuell verwendeten XML-Datei zu erhalten, kann die folgende Definition verwendet werden. Jedes AAAA in der Datendatei wird dann durch den aktuellen Dateinamen ersetzt.
<entity> <file>$MYFILE</file> <search>AAAA</search> <replace>$NAME</replace> </entity>
Diese Ersetzungen werden erst dann gemacht, wenn der Text eines XML-Elementes in ein InDesign®-Dokument eingesetzt wird. Sie gelten nur für genau festgelegte Platzhalter. Hintergrund dieser Ersetzungen ist, dass beispielsweise die HTML-Angabe <B> in Abhängigkeit von der Zielstelle im InDesign®-Dokument verschiedene Ersetzungen benötigt. Die Definitionen können deaktiviert werden.
Das folgende Beispiel beschreibt die nötigen Definitionen, um ein <B> im Platzhalter 1 in eine bestimmte Schriftdefinition umzusetzen. Es werden zwei Definitionen benötigt, für Anfang- und Ende-Tag.
Beachten Sie, dass Sie zwar <b> als Wert angeben können, dieses öffnende Tag wird automatisch ersetzt. Aber das schließende Tag (</b>) muss in XML-kompatibler Schreibweise angebenen werden. Beachten Sie weiterhin, dass die Definition der Schriftart (hier <cFont:Verdana>) als öffendes Tag in dieser Schreibweise angegeben werden darf, aber nicht <cFont:Verdana Bold>, denn Verdana Bold ist wegen des Leerzeichens kein gültiger XML-Elementname.
Sie sollten in den Definitionen der Datei xentities.xml auf die bequeme <>-Schreibweise verzichten und die Klammern immer in der Schreibweise <> verwenden.
<placeholderrel> <plid>1</plid> <enabled>1</enabled> <search><b></search> <replace><cFont:Verdana></replace> <placeholderrel> </placeholderrel> <plid>1</plid> <enabled>1</enabled> <search></b></search> <replace><cFont:></replace> </placeholderrel>
Der Datentyp von Elementen wird für Vergleiche und Sortierungen benötigt. Im Normalfall werden alle Elemente, die (case insensitive) mit id oder sequencenr beginnen, oder auf diese Begriffe enden, als Zahlen betrachtet, alle anderen Attribute sind Strings. Mit typedef Elementen in der Entity-Datei können diese Festlegungen geändert werden. Als Dateipfade können die in der Palette Einstellungen definierten Aliasnamen verwendet werden. Als mögliche Werte für type sind folgende Angaben erlaubt:
Bezeichner, die auf ID enden, werden automatisch als Zahlen betrachtet. Im folgenden Beispiel wird festgelegt, dass ProductID der Datei products.xml als Zeichenkette verarbeitet werden soll.
<typedef> <file>products.xml</file> <attr>ProductID</attr> <type>string</type> </typedef>
Beim Einlesen der XML-Dateien können sogenannte Dummy-Knoten erzeugt werden. Auf die Werte dieser Knoten kann in der üblichen Weise zugegriffen werden, als wären sie in der XML-Datei definiert worden.
Sie geben die Datei an, für die eine Definition gelten soll und den Elternknoten des Dummies. Als Dateipfade können die in der Palette Einstellungen definierten Aliasnamen verwendet werden. Als Elternknoten dürfen keine TextElemente verwendet werden. Der Dummy wird mit einem Namen und einem Wert definiert. Als Werte sind die folgenden Angaben zulässig :
Beschreibung | Beispiel | |
@beliebiger Text | Verwende den hinter dem @ stehenden Text. | @Fehlendes Attribut
Fehlendes Attribut |
[#]attributeName {attributeName} |
Verwende den Hash-Code des Inhalt des Attributes attributeName. Das Attribut muss neben dem fehlenden Attribut (also im selben XML-Element wie in <attr> angegeben) liegen. [Ab v3.3 R2712, 16. Nov. 2011] Mit vorangestelltem # wird statt des Hash-Codes der direkte Inhalt des Attributes zurückgegeben. [Ab v3.3 R2712, 16. Nov. 2011] Sie können eine beliebig lange Liste von Attributnamen angeben. Die Attributnamen müssen dabei jeweils mit einem Leerzeichen getrennt werden. Diese Liste wird solange durchsucht, bis ein existierendes Attribut gefunden wird, dessen Inhalt dann verwendet wird. |
#author image price Verwende den Author des Produktes. Fehlt diese Angabe, verwende den Bildpfad. Fehlt auch der, dann nimm den Preis. |
Für einen Elternknoten können beliebig viele Dummies erzeugt werden.
Dummyknoten des Typs lineno eignen sich gut dafür, die Sortierreihenfolge der Datensätze gemäß ihrer Reihenfolge in der XML-Datei sicherzustellen.
Das folgende Beispiel legt beim Einlesen der Datei products.xml im Element products.product.grid die zwei Unterlemente myid und myid2 an. Das erste Element enthält die aktuellen Zeilennummer der XML-Datei, das zweite den Zähler der Dummy-Knoten. Der erste Knoten wird bei commit in die Datei products.xml übernommen. Die dritte Definition legt für jeden Produktknoten ein Element an, dessen Inhalt den Namen des Produktes möglichst eindeutig auf eine positive Zahl abbildet.
<dummy> <file>products.xml</file> <attr>products.product.grid</attr> <name>myid</name> <type>lineno</type> <writable>1</writable> </dummy> <dummy> <file>products.xml</file> <attr>products.product.grid</attr> <name>myid2</name> <type>dummycounter</type> <writable>0</writable> </dummy> <dummy> <file>products.xml</file> <attr>products.product</attr> <name>myid</name> <type>#name</type> <writable>0</writable> </dummy>
Platzhalterobjekte sind stets mit einer sogenannten classID (integer) versehen. Diese Nummer steuert unter anderem, ob in einer Palette die Menübefehle zum Laden und Sichern von Platzhaltern aktiviert sind. So ist z.B. der Befehl Aktualisiere Produkte der Textauswahl nur dann aktiv, wenn auch tatsächlich ein Platzhalter mit einem Produkt im Dokument ausgewählt ist.
Mitunter kommt es vor, dass Platzhalter mit eigenen Klassen-IDs versehen werden. In diesem Fall ist es wünschenswert, auch diese Platzhalter über eine definierte Palette bearbeiten zu können. Mit <classmap> können die Zuordnungen gemacht werden. Die Definitionen werden in den folgenden Fällen ausgewertet :
Im folgenden Beispiel wird festgelegt, dass alle Platzhalter der Klassen 4 und 400 auch über die Palette Produktrecherche (classID 3) bearbeitet werden können.
<classmap> <id>3</id> <map><id>4</id></map> <map><id>400</id></map> </classmap>
Zusätzlich zur eigentlichen Datenabfrage muss die Anweisung natürlich wissen, in welcher XML-Datei sie arbeiten soll. Den Anweisungen wird daher (in Anführungszeichen) die Datei, auf der gearbeitet werden soll, vorangestellt.
Das Panelstatement ermittelt die IDs und Namen aller Domains. Die Daten sind in der XML-Datei domains.xml enthalten.
"domain.xml" xmlget id, name node domains.domain where id < 0
Pfade dürfen mit den üblichen Alias-Präfixen $HOME, $DESKTOP, $DOCUMENTS, $PLUGINS, ... beginnen. Unvollständige Dateipfade werden relativ zum aktuellen Datenordner aufgelöst.
Mit Hilfe der Palette Einstellungen können weitere Aliasse definiert werden.
Aliasse werden in der Datei datafiles.xml definiert. Unvollständige Pfade in den Definitionen werden relativ zum aktuellen Datenordner aufgelöst. Um die aktuellen Zuordnungen zu ermitteln oder zu ändern können die Funktionen file::enable_datafile, file::setdatafile und file::getdatafile verwendet werden.
Hier ein Beispiel einer gültigen Datei. Der Alias MYFILE wird viermal definiert. Ein Eintrag ist aktiviert. Die ersten beiden Definitionen zeigen auf zwei Dateien im aktuellen XML-Datenordner, die letzte auf eine Datei des Desktops.
<?xml version="1.0"?> <datafiles> <datafile> <id>0</id> <path></path> <alias></alias> <description>no</description> <enabled>0</enabled> </datafile> <datafile> <id>1</id> <path>products.xml</path> <alias>MYFILE</alias> <description></description> <enabled>1</enabled> </datafile> <datafile> <id>2</id> <path>products2.xml</path> <alias>MYFILE</alias> <description></description> <enabled>0</enabled> </datafile> <datafile> <id>3</id> <path>$DESKTOP/products.xml</path> <alias>MYFILE</alias> <description></description> <enabled>0</enabled> </datafile> <datafiles>
[Ab v4.1.5 R24666] Plugnis und comet_pdf unterstützen XPATH 1.0 für das Lesen von Daten aus XML-Dateien.
This software is based on pugixml library (http://pugixml.org). pugixml is Copyright (C) 2006-2018 Arseny Kapoulkine.
Die Integration von XPATH in die priint:comet Software erfolgte in der Hoffung, Ihnen die Arbeit zu erleichtern. Bitte haben Sie Verständnis dafür, dass die Implementierung möglicherweise nicht alle Features und Funktionen von XPATH enthält. Für die Lösung extrem spezieller Abfragen verwenden Sie bitte die Funkionen des Modules xmlnode.
Folgende Funktionen stehen in XPATH-Abfragen zur Verfügung. Beschreibungen zu diesen Funktionen finden Sie in den einschlägigen Dokus zu XPATH. Eine recht gute (deutsche) Seite finden Sie hier.
Um Datensätze mit mehreren Ergebnisspalten zu erhalten, können Ergebnisse mit | verbunden werden. Jeder Teilausdruck ergibt eine eigene Ergebnisspalte. Die Ausgabe erfolgt in der Reihenfolge wie in der Anweisung. Unvollständige Datensätze werden übersprungen.
Bitte beachten Sie : Alle Elemente einer Ergebniszeile müssen exakt den gleichen Elternknoten in der XML-Daten haben! Ergebnisse von Elementen verschiedener Eltern müssen in mehreren Abfragen ermittelt werden. (Und wenn Sie die Ergebnisse dieser verschiedenen Listen zu Ergebnis-Tupeln zusammenstellen wollen, werden Sie auch feststellen, warum man diese Einschränkung machen muß, wenn man gleichzeitig unvollständige und unsortierte Elemente erlauben will. )
Gegeben Sei folgende einfache XML-Struktur. Das komplette Beispiel finden Sie unten.
<a> <b> <d>A</d> <c>1</c> </b> <b> <c>2</c> </b> <b> <c>3</c> <d>C</d> </b> </a>
... und die Anweisung
/a/b/c | /a/b/d
... dann erhalten Sie folgende Ergebnisse. Der erste Datensatz wird dabei in anderer Reihenfolge als in der XML ausgegeben, weil die Reihenfolge der Anweisung beachtet wird. Der zweite Datensatz wird übersprungen, weil er unvollständig ist.
1, A 3, C
Die Definition von XPATH sieht offenbar keine 'Spalten' mit festen Werten vor - die mit | verknüpften Teile einer Anweisung müssen sämtlich Elemente der XML-Struktur sein. Wir haben in unserer Implementierung deshalb eine kleine Erweiterung eingefügt: Mit der Angabe
static-value "string"
können Sie Spalten mit festen Werten in die Ergebniszeilen einfügen. Enthält der statische String eine Zahl, kann (muß aber nicht) dieser Wert auch als Zahl abgeholt werden. Sie können beliebig viele statische Spalten definieren, aber die Anweisung muß mindestens eine variable Spalte enthalten.
Die Ergenisse des obigen Beispiels sollen eine zusätzliche zweite Spalte mit dem festen Wert 2024 erhalten:
/a/b/c | static-value "2024" | /a/b/d
Damit erhalten Sie die folgenden Ergebnisse:
1, 2024, A 3, 2024, C
static XMLTree xmlquery::open(
char* path,
int autoCommit = 0,
int useTreeBuffer = 1,
int autoUpload = 0,
int isLocal = 0,
int parseImmediate = 0)
Öffnen eines dateibasierten XML-Baumes. Der erzeugte Baum muss mit close wieder geschlossen werden!.
Name | Typ | Default | Beschreibung |
Return | XMLTree | Erzeugter Baum der XML-Datei 0 : Fehler - Datei nicht gefunden oder XML nicht valide |
|
path | String oder char* | - | Vollständiger Pfad einer existierenden XML-Datei. Der
Pfad darf mit einem definierten Datei-Alias beginnen. In XML-Offline-, SOAP- und AEM®-Verbindungen können hier auch XML-Daten der Konfiguration wie panelstatements.xml und actions.xml gelesen werden. |
autoCommit | int | 0 | Sollen Änderungen beim Schließen des XMLTrees automatisch gesichert werden? Beachten Sie bitte, dass Konfigurationsdaten auch an anderen Stellen der Plugins verwendet werden und Änderungen an diesen Daten zu Programmfehlern führen können! XML-Daten, die aus einer SOAP- oder AEM®-Verbindung gelesen wurden, haben keine lokale Datei, autoCommit auf diesen Bäumen hat daher keine Auswirkung. Verwenden Sie dafür den Parameter autoUpload. |
useTreeBuffer | int | 1 | Das Lesen von XML-Dateien kann zeitaufwändig sein. Gelesene Dateien können deshalb gepuffert werden. Gepufferte XML-Daten werden bei Trennen der Verbindung gelöscht. |
autoUpload | int | 0 | Sende die XML beim Schließen des Baumes an die Ursprungsquelle der Datenverbindung. Der Parameter hat nur Wirkung bei XMLs, die aus einer SOAP- oder AEM®-Verbindung geladen wurden! |
isLocal | int | 0 | In SOAP- und AEM®-Verbindungen werden XML-Dateien automatisch aus der Datenquelle geladen. Zum Laden lokaler Dateien setzen Sie den Parameter auf 1. Der Dateipfad path muss in diesem Fall ein vollständiger Pfad sein! |
parseImmediate | int | 0 | Sofort einlesen? Normalerwesie wird der Baum erst bei Bedarf eingelesen, da beim Öffnen noch nicht klar ist,
ob xmlquery oder XPATH als Abfragesprache verwendet werden soll und beide Methoden unterschiedliche interne Repräsentationen des Baums benötigen. 0 : Nein 1 : Ja |
Lade den Inhalt eines Platzhalters aus der aktuellen Datendatei $DATAFILE. Wird das gewünschte Produkt nicht gefunden, wird ein bedingter Text mit einer Fehlerbeschreibung ins Dokument eingefügt.
#include "internal/types.h" #include "internal/text.h"
int main () { XMLTree tree = 0; char name [5000]; int found = 0;
strcpy (name, "");
tree = xmlquery::open("$DATAFILE");
xmlquery::send(tree, "select name node posters.poster where ID = ?"); xmlquery::input(tree, kInt, gRecordID); xmlquery::output(tree, kString, name);
xmlquery::exec(tree); while (xmlquery::fetch (tree)) found = 1;
xmlquery::close(tree);
if (!found) { strcpy (name, "%!TT<DefineCondition:ERRORCODE=<ConditionColor:1,0,0>"); strcat (name, "<ConditionIndicatorMethod:Highlight><ConditionVisibility:0>>"); strcat (name, "<cConditionalText:ERRORCODE>Product not found!<cConditionalText:>"); }
textmodel::replace (name);
return 0; }
Schreibe den Inhalt eines Platzhalters HTML-formatiert in eine XML-Datei zurück.
#include "internal/types.h" #include "internal/text.h"
int main () { String htmlText = string::alloc (); XMLTree tree = xmlquery::open ("$DATAFILE", 1, 1, 1);
html::export_frame (gFrame, "kOutputBuffer", htmlText, "kCSSEscapeMode", 1, "kBodyOnly", 1, "kEscapeBrackets", 0);
string::insert (htmlText, 0, "%!TT_html_");
xmlquery::send(tree, "update description = ? node books.productgroup where productgroupID = ? node book where bookID = ?"); xmlquery::input(tree, kString, htmlText); xmlquery::input(tree, kInt, 10); xmlquery::input(tree, kInt, 100);
xmlquery::exec(tree); xmlquery::close(tree);
return 0; }
static XMLTree xmlquery::parse(char* xml)
Öffnen eines string-basierten XML-Baumes. Der erzeugte Baum muss mit close wieder geschlossen werden!.
Name | Typ | Default | Beschreibung |
Return | XMLTree | Erzeugter Baum des XML-Strings 0 : Fehler - XML nicht valide |
|
xml | String oder char* | - | Valider XML String. |
static int xmlquery::close(XMLTree tree, int doFlush = 0)
Schließen eines XML-Baumes. Der Befehl muss für jeden mit xmlquery::open oder xmlquery::parse erzeugten XML Baum gemacht werden. Wurde die XML-Datei mit autocommit geöffnet, werden Änderungen an der Datei zuvor geschrieben.
Name | Typ | Default | Beschreibung |
Return | int | 0 oder Fehlercode | |
tree | XMLTree | - | Mit xmlquery::open oder xmlquery::parse erzeugter Baum einer XML Datei. |
doFlush | int | 0 | Alle Comet-internen Daten der XML-Datei entfernen? 0 : nein 1 : ja. Die Datei wird beim nächsten öffnen neu gelesen. Die Anweisung hat nur Wirkung für XMLTrees, die mit gesetztem useTreeBuffer geöffnet wurden. Es darf kein XMLTree der gleichen Datenquelle mehr geöffnet sein. Comet-Standard XMLTrees wie actions.xml, panelstatements. xml, ... dürfen nicht "ge-flusht" werden. |
static int xmlquery::send(XMLTree tree, char* cmd)
Senden einer XML-Anweisung zum Ermitteln von Werten eines XML Baumes. Nachfolgende Aufrufe von xmlquery::send, xmlquery::isend und xmlquery::fsend erweitern die XML-Anweisung. Die Anweisung wird durch xmlquery::exec ausgeführt und danach auf "" zurückgesetzt.
Die Anweisung kann in xmlquery oder XPATH geschrieben werden.
XPATH wird ab v4.1.5 R24590 unterstützt.
Name | Typ | Default | Beschreibung |
Return | int | 0: Fehler 1: Erfolgreich |
|
tree | XMLTree | - | Mit xmlquery::open oder xmlquery::parse erzeugte Repräsentation einer XML Datei. |
cmd | String oder char* | - | Anweisungtext |
Das Beispiel zeigt zwei Datenabfragen, einmal in xmlquery- und einmal in XPATH-Syntax einer
XML-Datei mit folgendem Inhalt:
<a>
<b>
<d>A</d>
<c>1</c>
</b>
<b>
<c>2</c>
</b>
<b>
<c>3</c>
<d>C</d>
</b>
</a>
Beide Abfragen liefern das gleiche Ergebnis :
(1-A)
(3-C)
#include "internal/types.h" #include "internal/text.h" int main () { XMLTree tree; int tst; String s1 = string::alloc (); String s2 = string::alloc (); String s3 = string::alloc ();
tree = xmlquery::open ("$DESKTOP/abc.xml", 1, 1, 1);
for (tst = 0; tst < 2; tst++) { if (tst == 0) xmlquery::send (tree, "select c, d node a.b"); else if (tst == 1) xmlquery::send (tree, "/a/b/c | /a/b/d");
xmlquery::output (tree, kString, s1); xmlquery::output (tree, kString, s2);
xmlquery::exec (tree); if (tst == 0) frame::replace (gFrame, "%!TT<ParaStyle:>xmlquery<ParaStyle:>"); else frame::append (gFrame, "%!TT<ParaStyle:><ParaStyle:>XPATH<ParaStyle:>");
while (xmlquery::fetch (tree)) { string::set (s3, "%%!TT<ParaStyle:> (%s-%s)\n", s1, s2); frame::append (gFrame, s3); } }
xmlquery::close (tree);
return 0; }
static int xmlquery::send_cdata_begin(XMLTree tree)
Beginnen eines CDATA-Blockes in der xml-Anweisung. Die Anweisung ist identisch dem Aufruf xmlquery::send ("<![CDATA["),
aber wer kann sich das schon merken? Der Aufruf kann auch für Elemente verwendet werden, die in der XML-Datei bereits mit
CDATA definiert sind. Ein geöffneter CDATA-Block muss mit send_cdata_end wieder geschlossen werden.
Innerhalb von CDATA-Blöcken darf der String ![[[CDATA[ nicht verwendet werden.
Name | Typ | Default | Beschreibung |
tree | XMLTree | - | Mit xmlqyery::open erzeugte Repräsentation einer XML-Datei |
static int xmlquery::send_cdata_end(XMLTree tree)
Beenden eines CDATA-Blockes in der xml-Anweisung. Die Anweisung ist identisch dem Aufruf xmlquery::send ("]]>"), aber wer kann sich das schon merken? Der Aufruf kann auch für Elemente verwendet werden, die in der XML-Datei bereits mit CDATA definiert sind.
Name | Typ | Default | Beschreibung |
tree | XMLTree | - | Mit xmlqyery::open erzeugte Repräsentation einer XML-Datei |
static int xmlquery::isend(XMLTree tree, int i)
Senden einer Ganzzahl an eine XML-Anweisung. Der Befehl wirkt wie xmlquery::send mit dem Unterschied, dass die Zahl als Text an die Anweisung angefügt wird.
Name | Typ | Default | Beschreibung |
tree | XMLTree | - | Mit xmlquery::open erzeugte Repräsentation einer XML Datei. |
i | int | - | Ganzzahl, die an die XML-Anweisung angefügt werden soll. |
static int xmlquery::fsend(XMLTree tree, float f)
Senden einer Kommazahl an eine XML-Anweisung. Der Befehl wirkt wie xmlquery::send mit dem Unterschied, dass die Kommaahl als Text an die Anweisung angefügt wird. Die Präzision der Zahlen ist auf 6 Nachkommastellen begrenzt.
Name | Typ | Default | Beschreibung |
tree | XMLTree | - | Mit xmlquery::open erzeugte Repräsentation einer XML Datei. |
f | float | - | Kommazahl, die an die XML-Anweisung angefügt werden soll. |
static int xmlquery::input(
XMLTree qu,
int type,
char* value)
Binden eines Wertes an den entsprechenden Wertplatzhalter im xmlquery-Befehl.
Im Unterschied zu query::input wird der übergebene Wert auch bei Variablen hier sofort eingesetzt.
Die Angabe des zweiten Parameter ist zwingend und muss zum Datentyp des zugehörigen Tabellenattributes passen.
Name | Typ | Default | Beschreibung |
Return | int | 1 = Okay 0 = Fehler |
|
tree | XMLTree | - | Ein mit xmlquery::open geöffneter XML-Baum. |
type | int | - | Typ des Wertes. Der Datentyp, der zu einem
Variablenplatzhalter gehört, ergibt sich aus der jeweiligen Anweisung.
Es ist Aufgabe des Skriptprogrammierers, die richtigen
Wertetypen zu binden. kInt kFloat Die Präzision der Zahlen ist auf 6 Nachkommastellen begrenzt. kString kCDATA |
value | depends | - | Dieser Wert wird an Stelle des zugehörigen Variablenplatzhalters (?)
an die Datenbank gesendet. Der Typ des Parameters hängt vom Wert type ab.
Passen type und Datentyp von value nicht zusammen, kann das zum Absturz von InDesign® oder zu
unerwarteten Daten auf der Datenbank führen! kInt: int, short, long (z.B -1, 0, 1, 2) kFloat : float, real (z.B. -1.0, 1.0, 1.1), Die Präzision der zahle ist auf 6 Nachkommastellen begrenzt. kString : String oder char* (z.B. "", "paul") kCDATA : String oder char* (z.B. "", "paul") |
Sei folgender Befehl gesendet
select name, age, cv node persons.person where name like ? and age > ?
Dann werden Eingabebindungen der folgenden Art erwartet:
xmlquery::input (tree, kString, "Paul%"); xmlquery::input (tree, kInt, 10);
static int xmlquery::output(
XMLTree tree,
int type,
int* pointer)
xmlquery_output Binden von Variablen an die Ergebnisspalten der XML-Anweisung. Dabei wird das Ergebnis
der ersten Ergebnisspalte an die erste gebundene Variable übergeben usw.. Da XML-Dateien
keine Typinformationen enthalten ist der Typ der Ergebnisspalte beliebig. Es muss lediglich sichergestellt sein, dass
der Spaltenwert in den Zieltyp umgerechnet werden kann. Enthält die XML-Datei z.B.
Kommazahlen, kann die entsprechende Spalte sowohl an Strings, Ganzzahlen oder Kommazahlen
gebunden werden. Die Anweisung benötigt den Include
#include "internal/types.h"
Das Binden von Variablen an die Ergebnisspalten kann vor oder nach xmlquery::exec erfolgen. Findet xmlquery::fetch keine weiteren Ergebnisse mehr, werden die Bindungen zurückgesetzt.
Name | Typ | Default | Beschreibung |
Return | int | 1: Okay 0: Fehler |
|
tree | XMLTree | - | Mit xmlquery::open erzeugte Repräsentation einer XML Datei. |
type | int | - | Datentyp der folgenden Variable wie folgt : kInt : Zeiger auf eine Ganzzahl kFloat : Zeiger auf eine Kommazahl kString : char*-Variable. Wenn der Typ char* ist, muss die Variable über genügend reservierten Speicher verfügen. |
pointer | int*, float*, String oder char* | - | Zielvariable wie oben beschreiben. |
allocatedSize | int | 0 | Größe des reservierten Speichers für Stringergebnisse. Wenn pointer vom Typ String ist, wird diese Angabe ignoriert Zu wenig Speicherplatz für die Stringergebnisse sind eine häufige Usache für schwer nachvollziehbare Skriptabstürze. Mit der Angabe der maximalen Länge des Strings wird sichergestellt, dass nur in reservierte Speicherbereiche geschrieben wird. Ergebnisse werden bei Bedarf auf die angegebene Länge gekürzt. Die Speicherlänge beinhaltet ein Byte für die stringabschließende 0. 0 : Fehlt die Angabe oder ist 0, werden die Rückgabewerte ohne Prüfung ihrer Länge vollständig in die Zielvariable eingesetzt. |
static int xmlquery::exec(XMLTree tree, int showErrors = 0)
Ausführen der XML-Anweisungen. Der Aufruf setzt automatisch die XML-Anweisung des Queries zurück.
Name | Typ | Default | Beschreibung |
Return | int | 1 Okay 0 Fehler Mit den Funktionen xmlquery::error und xmlquery::errnum kann eine Beschreibung des Fehlers geholt werden. |
|
tree | XMLTree | - | Mit xmlquery::open erzeugte Repräsentation einer XML Datei. |
showErrors | int | 1 | Sollen die Bearbeitungsfehler automatisch angezeigt werden? 0 - Fehler nicht in einem Fehlerdialog zeigen. Das Skript macht die Fehlerbehandlung selbst. sonst - Standardfehler-Dialog zeigen Eine Liste der möglichen Fehler und ihrer Beschreibung finden Sie hier. Beachten Sie bitte, dass Warnungen z.B. über fehlende Attribute oder Elemente NICHT als Fehler sondern lediglich als Warnungen angesehen werden und daher durch das Setzen von showErrors nicht gesehen werden. Verwenden Sie für diesen Fall die Funktion xmlquery::get_exec_infos. |
static int xmlquery::fetch(XMLTree tree)
Abholen der nächsten Ergebnisspalte der XML-Anweisung. Vor dem Abholen der Ergebnisse müssen die Spalten an Variablen gebunden werden (siehe xmlquery::output). Findet xmlquery::fetch keine weiteren Ergebnisse mehr, werden die Bindungen zurückgesetzt.
Name | Typ | Default | Beschreibung |
Return | int | 1 Ergebnis gefunden 0 keine weiteren Ergebnisse. Mit xmlquery::output gesetzte Variablenbindungen werden zurückgesetzt. |
|
tree | XMLTree | - | Mit xmlquery::open erzeugte Repräsentation einer XML Datei. |
static int xmlquery::error(XMLTree tree, char* mess)
Fehlerbeschreibung der letzten XML-Anweisungsausführung. Eine Liste der möglichen Fehler finden Sie hier.
Beachten Sie bitte, dass Warnungen über fehlende Attribute oder Elemente NICHT als Fehler sondern lediglich als Warnungen angesehen werden. Um vor fehlenden Attributen oder Elmenten zu warnen, verwenden sie die Funktion xmlquery::get_exec_infos.
Name | Typ | Default | Beschreibung |
Return | String oder char* (Abhängig von Parameter mess) | Fehlerbeschreibung der letzten XML-Anweisung. Entspricht Parameter mess. | |
tree | XMLTree | - | Mit xmlquery::open erzeugte Repräsentation einer XML Datei. |
mess | String oder char* | - | Reservierter Speicher für die Fehlermeldung (im Fall von Typ char* mindestens 256 Bytes) |
static int xmlquery::errnum(XMLTree tree)
Fehlercode der letzten XML-Anweisungsausführung.
Beachten Sie bitte, dass Warnungen über fehlende Attribute oder Elemente NICHT als Fehler sondern lediglich als Warnungen angesehen werden. Um vor fehlenden Attributen oder Elmenten zu warnen, verwenden sie die Funktion xmlquery::get_exec_infos.
Die folgenden Tabelle beschreiben die Fehlercodes und Warnungen, die vn XML-Queries erzeugt werden können.
Fehlercodes von XML-Queries
Nr. | Beschreibung |
0 | Keine Fehler |
-43 | Datei nicht gefunden oder fehlerhaft. |
1 | Index must not point to the root Element. |
2 | xmlset : Error while changing values. |
3 | xmlinsert : Error while setting values. |
4 | Empty xmlget command. |
5 | Keyword xmlget, xmlset, xmlinsert or xmldelete missing. |
6 | Unexpected end of xmlget. |
7 | There should never be a where without a node. |
8 | Missing value in xmlset/xmlinsert, must be of type int, real or string. |
9 | Missing '|'. |
10 | There must be a where before the next node. |
11 | There should never be a where without a node. |
12 | Orderby is the last key word. |
15 | Orderby failed, column must be in the result xmlcolumns. |
16 | xmlcommit : Cannot write empty xml tree. |
17 | xmlcommit : Writing file failed. |
Warnungen von XML-Queries Fehlende Elemente oder Attribute führen zu Warnungen bei der Ausführung von Anweisungen. Zum Ermitteln möglicher Warnungen einer XML-Anweisungen verwenden Sie die Funktion xmlquery::get_exec_infos.
Nr. | Beschreibung |
0 | Keine Warnungen und Fehler |
1290 | Node nodeName used in columns not found. |
1293 | Error on traversing nodes while creating index. |
1299 | Node nodeName used in where not found. |
Name | Typ | Default | Beschreibung |
Return | int | Fehlercode der letzten XML-Anweisungsausführung. | |
tree | XMLTree | - | Mit xmlquery::open erzeugte Repräsentation einer XML Datei. |
static int xmlquery::get_exec_infos(XMLTree tree, char* warnings)
Hat ein XML-Query Warnungen oder Fehler erzeugt? Die Anweisung ermittelt die Informationen der zuletzt ausgeführten Anweisungen für einen XMLTree.
Name | Typ | Default | Beschreibung |
Return | int | Letzter Fehlercode der letzten XML-Anweisung eines XMLTrees 0 : Okay sonst : siehe hier |
|
tree | XMLTree | - | Mit xmlquery::open erzeugte Repräsentation einer XML Datei. |
warnings | String oder char* | 0 | String für die Nachrichten 0 : Ignorieren sonst : Allokierter Speicher für die Warnungen und Fehler (bei char* mind. 4096 Bytes). |
XMLTree tree = xmlquery::open ...;
char execInfos [4096];
:
:
xmlquery::exec (tree);
if (xmlquery::get_exec_infos (tree, execInfos))
{
showmessage("XMLError %s", execInfos);
}
static int xmlquery::app_path(char* p)
Ermittle den aktuellen Programmpfad zu den iQuest Comet XML-Daten. Dieser Ordner wird global in InDesign® eingestellt und enthält unter anderem die Datei placeholder.xml und den Ordner actions, mit den die Platzhalter und ihre Aktionen definiert werden.
Name | Typ | Default | Beschreibung |
Return | String oder char* (Abhängig von Parameter p) | Aktueller Programmpfad zu den iQuest Comet XML-Daten, entspricht Parameter p | |
p | String oder char* | - | Reservierter Speicher für das Ergebnis. |
char p[4069];
showmessage ("%s", xmlquery::app_path (p));
static XMLTree xmlquery::process(
char* destinationPath,
char* definition,
long serviceId = -1,
long sourceId = -1,
int force = 0)
Generieren einer XML-Datei (und / oder internen Repräsentation) aus der angegebenen Service-Definition (ggf. unter Verwendung eines bestimmten Service / einer bestimmten Datenquelle)
Name | Typ | Default | Beschreibung |
Return | XMLTree | aus der Datenquelle / Import Service erzeugter XML-Baum oder 0 | |
destinationPath | String oder char* | - | Zielpfad für die erzeugte XML-Datei, 0 oder Leerstring: keine Datei schreiben |
definitionPath | String oder char* | - | Pfad der Definitionsdatei |
serviceId | int | -1 | ID des Service, Default: -1 (erster verfügbarer) |
sourceId | int | -1 | ID der Quelle, Default: -1 (erste verfügbare) |
force | int | 0 | Verarbeitung erzwingen. Normalerweise wird vor Neu-Einlesen geprüft, ob unter dem angegebenen XML-Zielpfad bereits geparste Daten noch aktuell sind bzw. aus der XML-Zieldatei gelesen werden kann. |
static char* xmlquery::serialize(XMLTree tree, char* buffer)
Serialisieren eines XML-Baums. Das Ergebnis wird in buffer kopiert. Wenn buffer vom Typ char* ist, muss vorher ein ausreichend großer Speicher allokiert werden.
Name | Typ | Default | Beschreibung |
Return | String oder char* (Abhängig von Parameter buffer) | XML-String, entspricht Parameter buffer | |
tree | XMLTree | - | Mit xmlquery::open erzeugte Repräsentation einer XML Datei. |
buffer | String oder char* | - | Ausreichender Speicher für das serialisierte XML |
static int xmlquery::write(XMLTree tree, char* destPath)
Schreiben eines XML-Baums in eine Datei.
Name | Typ | Default | Beschreibung |
Return | int | 0 oder Fehlercode. | |
tree | XMLTree | - | Mit xmlquery::open erzeugte Repräsentation einer XML Datei. |
destPath | String oder char* | - | Dateiname und Pfad |
static char* xmlquery::to_json(
XMLTree tree,
char* entryPoint = "",
char* subValue = "")
Erzeuge ein JSON-String eines XML-Baumes oder von Teilen eines XML-Baumes.
Name | Typ | Default | Beschreibung | |||||||||
Return | char* | JSON-String (der Teile) des XML-Baumes oder "" im Fehlerfall. Der Rückgabewert darf nicht verändert werden und wird bei folgenden Aufrufen der Funktion überschrieben. Hier finden Sie Informationen zu readonly-Rückgaben von Funktionen. |
||||||||||
entryPoint | String oder char* | - | Gültiger Pfad auf eine Unterstruktur des Baumes "" : Gesamter Baum |
|||||||||
subValue | String oder char* | - |
Auswahlkriterium für UnterElemente der Einstiegsebene oder "" für alle UnterElemente. name operator value Hat das zu exportierende Element kein Unterelement oder Attribut des gegebenen Namens wird das Kriterium ignoriert und das Element exportiert.
|
Schreibe alle Cometgruppen des MetaDaten-Exports groups.xml, deren ID 89 enthält, in ein JSON.
int main () { XMLTree tree; char * json; int fi;
tree = xmlquery::open ("$DESKTOP/groups.xml", 0, 1, 0, 0, 1); json = xmlquery::to_json (tree, "/psc:grouplist/groups/group", "id ? '%89%'"); xmlquery::close(tree);
fi = file::open ("$DESKTOP/groups.json", "w"); file::write (fi, json); file::close (fi);
return 0; }
static int xmlquery::flush(char* xmlPath)
Löschen der Comet-internen XML-Daten einer Datei. Dadurch erzwingen Sie, dass die Datei beim nächsten Öffnen neu gelesen werden muss.
Die Anweisung hat nur Wirkung für XMLTrees, die mit gesetztem useTreeBuffer geöffnet wurden. Es darf kein XMLTree der gleichen Datenquelle mehr geöffnet sein. Comet-Standard XMLTrees wie actions.xml, panelstatements. xml, ... dürfen nicht "ge-flusht" werden.
Name | Typ | Default | Beschreibung |
Return | int | 0 oder Fehlercode | |
xmlPath | String oder char* | - | Vollständiger Pfad zur XML-Datei |
Alphabetic index HTML hierarchy of classes or Java