Bei der Domäne XMLNSC handelt es sich um eine Erweiterung der Domäne XMLNS, die wiederum eine Erweiterung der ursprünglichen Domäne XML ist.
Bei der Domäne XMLNS kam die Unterstützung von Namensbereichen hinzu. Die neue Domäne XMLNSC wurde für die Erstellung einer kompakteren Baumstruktur entwickelt, damit bei der Handhabung umfangreicher Nachrichten weniger Speicher benötigt wird. Es wurde eine neue Domäne hinzugefügt, damit bestehende Anwendungen nicht beeinträchtigt werden.
Nachrichtenbaumstruktur
<Folder1> <Folder2 Attribute1='AttributeValue1'> <Field1><Value1></Field1> <Field2 Attribute2='AttributeValue2'><Value2></Field2> </Folder2> </Folder1>
In der XMLNSC-Domäne wird dies durch zwei Namenselemente (Folder1 und Folder2) sowie vier Elemente des Typs 'Name-Wert' dargestellt (Attribute1, Field1, Field2 und Attribute2).
<Folder1> <Folder2> <Field1><Value1></Field1> <Field2><Value2></Field2> .... <Field100><Value100></Field100> </Folder2> </Folder1>
In diesem Fall stellt der XMLNSC-Parser die Nachricht durch zwei Namenselemente und 100 Elemente des Typs 'Name-Wert' dar, während die Parser XML und XMLNS 102 Namens- und 100 Wertelemente sowie weitere 103 Wertelemente für die Darstellung des in den formatierten Nachrichten implizierten Leerraums verwenden.
Die Domänen XML und XMLNS erstellen Elemente des Typs 'Name-Wert' für die Leerraumformatierungszeichen zwischen dem Schließen und dem Öffnen der einzelnen Ordner oder Felder.
Diese Leerraumelemente enthalten einen leeren Namen und einen Wert für Leerzeichen, Tabulator, Zeilenvorschub oder andere Zeichen, die für die Formatierung des XML-Dokuments verwendet werden. Diese Elemente haben keinen verwendbaren Wert und können deshalb gelöscht werden, um die Komprimierung zu verbessern.
Aus demselben Grund werden standardmäßig alle XML-Verarbeitungsanweisungen und Kommentare im Eingabedatenstrom gelöscht, und in der kompakten Domänenstruktur werden keine Elemente erstellt.
Attribute und codierter Text
SET Origin.Folder1.Folder2.(XMLNSC.Attribute)Attribute1 = 'AttributeValue1'; SET Origin.Folder1.Folder2.Field1 = ‘Value1’; SET Origin.Folder1.Folder2.(XMLNSC.Attribute)Attribute2 = 'AttributeValue2'; SET Origin.Folder1.Folder2.Field2 = ‘Value2’;
Der vorhergehende ESQL-Code scheint zwar nahezu identisch mit dem Code, der beim XML-Parser verwendet wird, die Typkonstanten gehören jedoch zum Parser XMLNSC. Die Verwendung von Konstanten, die zu anderen Parsern gehören (beispielsweise zum XML-Parser) führt zu unerwarteten Ergebnissen, da ähnlich benannte Konstanten (beispielsweise XML.Attribute) andere Werte aufweisen.
XMLNSC.SingleAttribute XMLNSC.DoubleAttribute
XMLNSC.Attribute
<Folder1 Item='ValueA'> <Item>Value1</Item> </Folder1>
SET ItemAttributeValueHolder = InputRoot.XMLNSC.Folder1.(XMLNSC.Attribute)Item; SET ItemFieldValueHolder = InputRoot.XMLNSC.Folder1.(XMLNSC.Field)Item;
Diese Methode hat gegenüber der Verwendung einer Feldgruppenindexauswahl mit Folder1 den Vorteil, dass es keine Auswirkungen hat, wenn das Attribut im Eingabedatenstrom nicht vorhanden ist.
Handhabung von gemischtem Text
Vorhandener gemischter Text wird standardmäßig gelöscht, da davon ausgegangen wird, dass er lediglich Formatierungsleerraum darstellt und keine sonstige Bedeutung hat.
Es wurde jedoch ein Modus bereitgestellt, bei dem während der Syntaxanalyse jeglicher
Text, der sich nicht zwischen einem DTL-Anfangs- und Endbefehl befindet (d. h. zwischen
open->open, close->close und
close->open), durch ein einzelnes nicht benanntes Wert-Element
dargestellt wird.
Die Wertelementtypen unterstützen PCDATA, CDATA sowie eine Mischform dieser beiden.
XMLNSC.Value XMLNSC.PCDataValue XMLNSC.CDataValue XMLNSC.HybridValue
XMLNSC.MixedContentRetainNone = 0x0000000000000000 XMLNSC.MixedContentRetainAll = 0x0001000000000000
DECLARE X BLOB ASBITSTREAM(InputRoot.XMLNSC.Data OPTIONS XMLNSC.MixedContentRetainAll); ... CREATE LASTCHILD OF outputRoot PARSE(X OPTIONS XMLNSC.MixedContentRetainNone);
Handhabung von Kommentaren
Vorhandene Kommentare werden ebenfalls standardmäßig gelöscht, da davon ausgegangen wird, dass es sich dabei lediglich um zusätzliche Informationen ohne besondere Bedeutung handelt.
XMLNSC.Comment
XMLNSC.CommentsRetainNone = 0x0000000000000000 XMLNSC.CommentsRetainAll = 0x0002000000000000Beispiel:
DECLARE X BLOB ASBITSTREAM(InputRoot.XMLNSC.Data OPTIONS XMLNSC.CommentsRetainAll); ... CREATE LASTCHILD OF outputRoot PARSE(X OPTIONS XMLNSC.CommentsRetainNone);
Handhabung von Verarbeitungsanweisungen
Vorhandene Verarbeitungsanweisungen werden ebenfalls standardmäßig gelöscht, da davon ausgegangen wird, dass es sich dabei lediglich um zusätzliche Informationen ohne besondere Bedeutung handelt.
XMLNSC.ProcessingInstruction
XMLNSC.ProcessingInstructionsRetainNone = 0x0000000000000000 XMLNSC.ProcessingInstructionsRetainAll = 0x0004000000000000Beispiel:
DECLARE X BLOB ASBITSTREAM(InputRoot.XMLNSC.Data OPTIONS XMLNSC.ProcessingInstructionsRetainAll); ... CREATE LASTCHILD OF outputRoot PARSE(X OPTIONS XMLNSC.ProcessingInstructionsRetainNone);
Einen bestehenden Fluss migrieren
SET OutputRoot.XML.Person.Salary = CAST(InputRoot.XML.Person.Salary AS INTEGER) * 3; SET OutputRoot.XMLNS.Person.Salary = CAST(InputRoot.XMLNS.Person.Salary AS INTEGER) * 3; SET OutputRoot.XMLNSC.Person.Salary = CAST(InputRoot.XMLNSC.Person.Salary AS INTEGER) * 3;
<Person><Salary>42</Salary></Person>
Die drei ESQL-Beispiele unterscheiden sich darin, dass sie für diese Elemente verschiedene Parser verwenden. Der Parser kann durch die eingehende Nachricht, mit einem MQRFH2-Header, wobei ein <mcd>-Ordner die Nachrichtengruppendomäne angibt, oder durch die Nachrichtengruppendomäne, die in den Standardeigenschaften des Empfangsknotens des Nachrichtenflusses definiert ist, festgelegt werden.
Wenn beide dieser Domänendefinitionen vorhanden sind, hat der Wert für die Nachrichtengruppendomäne im <mcd>-Ordner des MQRFH2-Headers Vorrang.
Wenn Sie eine Migration auf die Domäne XMLNSC durchführen möchten, ist bei Verwendung von MQRFH2-Headern der neue Domänenname im Feld <Msd> des Ordners <mcd> erforderlich.
Der neue Domänenname wird im MQRFH2-Header der abgehenden Nachricht angezeigt.
Damit externe Anwendungen vor diesen Änderungen geschützt sind, kann die Eigenschaft XMLNSC-Kompaktparser für XMLNS-Domäne verwenden auf dem Empfangsknoten des Flusses sowie auf dem Rechen- oder Zuordnungsknoten angegeben werden. Wenn diese Eigenschaften festgelegt sind, bleiben die Eingabe- und Ausgabenachricht unverändert, und als Wert für das Feld <Msd> kann XMLNS stehen bleiben.
Der Nachrichtenfluss verwendet jetzt den Kompaktparser, und die ESQL-Pfad werden mit XMLNSC codiert.
Wenn die eingehenden Nachrichten keine MQRFH2-Header enthalten und die Nachrichtendomäneneigenschaft des Empfangsknotens für die Angabe der Domäne verwendet wird, können Sie eine Migration auf die Domäne XMLNSC durchführen, indem Sie die Domäneneigenschaft des Empfangsknotens des Flusses direkt auf XMLNSC setzen, oder den Wert XMLNS lassen, wobei Sie in diesem Fall darüber hinaus die Eigenschaft XMLNSC-Kompaktparser für XMLNS-Domäne verwenden festlegen müssen. Bei beiden Einstellungen wird der Kompaktparser im Nachrichtenfluss verwendet, und die ESQL-Pfade müssen mit XMLNSC codiert werden.
Wenn die abgehenden Nachrichten keine MQRFH2-Header enthalten, wird die Domäne in den Ausgabenachrichten nirgends angezeigt, und die Festlegung der Eigenschaft XMLNSC-Kompaktparser für XMLNS-Domäne verwenden des Rechenknotens hat keine Auswirkungen.
XML-Header erstellen
SET OutputRoot.XML.(XML.XmlDecl)*.(XML.Version)* = '1.0';
SET OutputRoot.XMLNS.(XML.XmlDecl)*.(XML.Version)* = '1.0';
Hinweis: Auch wenn der Parser XMLNS verwendet wird, gehören die Elementtyp-Konstanten zum Parser XML. Diese Vorgehensweise funktioniert, weil die von den Parsern XML und XMLNS verwendeten Typwerte identisch sind. Beim Parser XMLNSC unterscheiden sich die Typwerte jedoch und müssen daher immer die eigenen Typkonstanten verwenden.
SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)Version = '1.0';
SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)Encoding = 'UTF-8'; SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)StandAlone = 'Yes';
Nachrichtenbaumstrukturen kopieren
Beim Kopieren von Baumstrukturen betrachtet der Broker XML und XMLNSC als ungleiche Parser. Dies bedeutet, dass alle Attribute in der Quellenbaumstruktur Elementen in der Zielbaumstruktur zugeordnet werden. Diese Situation entsteht nur, wenn Sie beide Parser in demselben Fluss verwenden - einen für die Eingabe, den anderen für die Ausgabe. Verwenden Sie daher für beide Flüsse den Kompaktparser.
Wenn für den Eingabe- und Ausgabefluss verschiedene Parser verwendet werden müssen, kann die explizite Angabe der Elementtypen in den Pfaden oder die Verwendung der FIELDVALUE-Funktion erforderlich sein, damit anstelle der untergeordneten Baumstrukturen eine Kopie der Skalarwerte gewährleistet ist.
Halten Sie sich an die Richtlinien für XML-Nachrichten, die im Abschnitt Nachrichten in der XML-Domäne bearbeiten genannt werden, sowie an die Informationen im Abschnitt Inhalt des Hauptteils einer Nachricht bearbeiten.
Mit Hilfe von Korrelationsnamen auf Syntaxelemente in der XMLNSC-Domäne zugreifen
Syntax- element | Korrelationsname | Konstanter Wert |
---|---|---|
Ordner | XMLNSC.Folder | 0x01000000 |
Dokumenttyp 1 | XMLNSC.DocumentType | 0x01000300 |
XML-Deklaration 2 | XMLNSC.XmlDeclaration | 0x01000400 |
Feld- oder Attributwert | XMLNSC.Value | 0x02000000 |
PCData value | XMLNSC.PCDataValue | 0x02000000 |
CData value | XMLNSC.CDataValue | 0x02000001 |
Hybridwert | XMLNSC.HybridValue | 0x02000002 |
Entitätsverweis | XMLNSC.EntityReference | 0x02000100 |
Feld | XMLNSC.Field | 0x03000000 |
PCData | XMLNSC.PCDataField | 0x03000000 |
CData | XMLNSC.CDataField | 0x03000001 |
Hybrid | XMLNSC.HybridField | 0x03000002 |
Attribut | XMLNSC.Attribute | 0x03000100 |
Einfaches Anführungszeichen | XMLNSC.SingleAttribute | 0x03000101 |
Doppeltes Anführungszeichen | XMLNSC.DoubleAttribute | 0x03000100 |
Namensbereichsdeklaration | XMLNSC.NamespaceDecl | 0x03000102 |
Einfaches Anführungszeichen | XMLNSC.SingleNamespaceDecl | 0x03000103 |
Doppeltes Anführungszeichen | XMLNSC.DoubleNamespaceDecl | 0x03000102 |
Bitstromdaten | XMLNSC.BitStream | 0x03000200 |
Entitätsdefinition 1 | XMLNSC.EntityDefinition | 0x03000300 |
Einfaches Anführungszeichen | XMLNSC.SingleEntityDefinition | 0x03000301 |
Doppeltes Anführungszeichen | XMLNSC.DoubleEntityDefinition | 0x03000300 |
Kommentar | XMLNSC.Comment | 0x03000400 |
Verarbeitungsanweisung | XMLNSC.ProcessingInstruction | 0x03000401 |
SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)BodyDocument.(XMLNSC.EntityDefinition)TestDef = 'Compact Tree Parser XML Test Module Version 1.0';
-- XML-Deklaration erstellen SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.Version = 1.0; SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.Encoding = 'UTF8'; SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.Standalone = 'yes';
Verwendung von 'EntityDefintion' und 'EntityReference' mit dem XMLNSC-Parser
<BookInfo dtn="BookInfo" edn="author" edv="A.N.Other"> <Identifier>ES39B103T6</Identifier> </BookInfo>
<!DOCTYPE BookInfo [<!ENTITY author "A.N.Other">]> <BookInfo><Identifier>ES39B103T7</Identifier><entref>&author;</entref></BookInfo>
SET OutputRoot.MQMD = InputRoot.MQMD; DECLARE cursor REFERENCE TO InputRoot.XMLNSC.BookInfo; SET OutputRoot.XMLNSC.BookInfo.Identifier = cursor.Identifier; SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)* NAME = cursor.dtn; SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)*.(XMLNSC.EntityDefinition)* NAME = 'author'; SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)*.(XMLNSC.EntityDefinition)author VALUE = cursor.edv; SET OutputRoot.XMLNSC.(XMLNSC.BookInfo).entref.(XMLNSC.EntityReference)* = 'author';
Mit der Variable cursor wird auf folgende Variablen gezeigt: auf dtn, den Dokumenttypnamen, edv, den Entitätsdefinitionswert und den Wert für Identifier.
Die Werte für diese Variablen stammen aus der Eingabenachricht.
<!DOCTYPE BookInfo [<!ENTITY author "Book 1">]> <BookInfo Identifier="ES39B103T6">&author;</BookInfo>
SET OutputRoot.MQMD = InputRoot.MQMD; DECLARE cursor REFERENCE TO InputRoot.XMLNSC.BookInfo; CREATE FIELD OutputRoot.XMLNSC.BookInfo; SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)* NAME = cursor.dtn; SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)*.(XMLNSC.EntityDefinition)* NAME = cursor.edn; SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)*.(XMLNSC.EntityDefinition)* VALUE = 'Book 1'; SET OutputRoot.XMLNSC.(XMLNSC.Folder)*[<].(XMLNSC.EntityReference)* = cursor.edn; SET OutputRoot.XMLNSC.Identifier.(XMLNSC.DoubleAttribute)Identifier = cursor.Identifier;
XMLNSC.EntityDefinition wird für die Definition der Entität author mit dem Wert Book 1 verwendet. Anschließend wird in der Nachricht mit XMLNSC.EntityReference ein Verweis auf die Entität 'author' erstellt.
Mit der Variable cursor wird auf folgende Variablen gezeigt: auf dtn, den Dokumenttypnamen, edn, den Entitätsdefinitionsnamen und den Wert für Identifier.
Diese Variablen stammen alle aus der Eingabenachricht. Mit dem Code XMLNSC.DoubleAttribute werden Anführungszeichen zu Identifier hinzugefügt. Zum Hinzufügen von Hochkommata zu Identifier kann XMLNSC.SingleAttribute verwendet werden.
Modi für XMLNSC-Parser
Standardmäßig löscht der XMLNSC-Parser Dokumentelemente, die normalerweise keine geschäftliche Bedeutung haben. Es sind jedoch Parsermodi verfügbar, die die Sicherung dieser Elemente erzwingen. Sie können diese Modi auf den Eigenschaften des Knotens konfigurieren, der angibt, dass die Nachricht in der XMLNSC-Domäne analysiert wird.
XMLNSC.MixedContentRetainNone XMLNSC.MixedContentRetainAll XMLNSC.CommentsRetainNone XMLNSC.CommentsRetainAll XMLNSC.ProcessingInstructionsRetainNone XMLNSC.ProcessingInstructionsRetainAllIm folgenden Beispiel werden die Modi XMLNSC.ProcessingInstructionsRetainAll und XMLNSC.ProcessingInstructionsRetainNone verwendet, um die Anweisungen zur Dokumentverarbeitung bei der Syntaxanalyse zu erhalten:
DECLARE X BLOB ASBITSTREAM(InputRoot.XMLNSC.Data OPTIONS XMLNSC.ProcessingInstructionsRetainAll); ... CREATE LASTCHILD OF outputRoot PARSE(X OPTIONS XMLNSC.ProcessingInstructionsRetainNone);