Die XMLNSC-Domäne ist eine Erweiterung der XMLNS-Domäne, die ihrerseits eine Erweiterung der XML-Domäne ist.
Bei der XMLNS-Domäne kam die Unterstützung von Namespaces hinzu. Die XMLNSC-Domäne baut auf einer kompakteren Baumstruktur auf und benötigt deshalb bei der Handhabung umfangreicher Nachrichten weniger Speicher. Sie können weiterhin die XMLNS-Domäne für bereits bestehende Anwendungen verwenden und die erhöhte Speicherleistung der XMLNSC-Domäne für neue Anwendungen nutzen.
Nachrichtenbaumstruktur
<Folder1> <Folder2 Attribute1='AttributeValue1'> <Field1>Value1</Field1> <Field2 Attribute2='AttributeValue2'>Value2</Field2> </Folder2> </Folder1>
In der XMLNSC-Domäne wird codierter Text durch zwei Namenselemente (Folder1 und Folder2) und 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 Beispiel stellt der XMLNSC-Parser die Nachricht durch zwei Namenselemente und 100 Elemente des Typs 'Name-Wert' dar, während der XML- und XMLNS-Parser 102 Namens- und 100 Wertelemente sowie weitere 103 Wertelemente zur Darstellung des in formatierten Nachrichten implizit enthaltenen Leerzeichens verwenden.
Die XML- und XMLNS-Domänen erstellen Elemente des Typs 'Name-Wert' für die Leerzeichen-Formatierungszeichen zwischen dem Schließen und Öffnen jedes einzelnen Ordners oder Feldes. Diese Leerzeichenelemente enthalten einen leeren Namen und einen Wert für das Leerzeichen, den Tabulator, den Zeilenvorschub oder andere Zeichen, die zur Formatierung des XML-Dokuments verwendet werden. Diese Elemente haben keinen Nutzwert 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 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';
Dieser ESQL-Code scheint zwar nahezu identisch mit dem Code, der beim XML-Parser verwendet wird, die Typkonstanten gehören jedoch zum XMLNSC-Parser. Die Verwendung von Konstanten, die zu anderen Parsern (z. B. XML) gehören, führt zu unerwarteten Ergebnissen, da ähnlich benannte Konstanten (z. B. XML.Attribute) andere Werte aufweisen.
XMLNSC.Attribute XMLNSC.SingleAttribute XMLNSC.DoubleAttribute
<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 ist besser geeignet als die Verwendung einer Feldgruppenindexauswahl mit Folder1, weil es nicht wichtig ist, ob das Attribut im Eingabedatenstrom vorhanden ist.
Handhabung von gemischtem Text
Gemischter Text wird standardmäßig gelöscht, da er normalerweise nur zur Formatierung von Leerzeichen dient und keine geschäftlichen Daten enthält. Es wird jedoch ein Modus bereitgestellt, in dem während der Syntaxanalyse jeglicher Text, der sich nicht zwischen einem DTL-Anfangs- und Endbefehl befindet (d. h. open->open, close->close und close->open), durch ein einzelnes nicht benanntes Wertelement dargestellt wird. Als Wertelementtypen werden PCDATA, CDATA und hybrid, eine Mischform der beiden ersten, unterstützt.
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
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
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);
Vorhandenen Nachrichtenfluss in die XMLNSC-Domäne 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 zuständige Parser kann entweder durch die eingehende Nachricht (mit einem MQRFH2-Header mit einem <mcd>-Ordner, der die Nachrichtengruppendomäne angibt) oder durch die Nachrichtengruppendomäne, die in den Eigenschaften für 'Syntaxanalyse der Eingabenachricht' des Empfangsknotens des Nachrichtenflusses definiert ist, festgelegt werden. Wenn beide Domänendefinitionen vorhanden sind, hat der Wert für die Nachrichtengruppendomäne im <mcd>-Ordner des MQRFH2-Headers Vorrang.
Um eine Migration auf die XMLNSC-Domäne durchzuführen, muss bei Verwendung von MQRFH2-Headern der neue Domänenname zum Feld <Msd> des <mcd>-Ordners hinzugefügt werden. Der neue Domänenname wird im MQRFH2-Header der abgehenden Nachricht angezeigt. Um externe Anwendungen vor diesen Änderungen zu schützen, geben Sie die Eigenschaft XMLNSC-Kompaktparser für XMLNS-Domäne verwenden auf dem Empfangsknoten des Nachrichtenflusses und dem Compute- oder Mapping-Knoten an. 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-Pfade 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 XMLNSC-Domäne durchführen, indem Sie die Domäneneigenschaft des Empfangsknotens des Nachrichtenflusses direkt auf XMLNSC setzen, oder Sie lassen den Wert XMLNS stehen, und legen die Eigenschaft XMLNSC-Kompaktparser für XMLNS-Domäne verwenden fest. 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 Compute-Knotens hat keine Auswirkungen.
XML-Header erstellen
SET OutputRoot.XML.(XML.XmlDecl)*.(XML.Version)* = '1.0';
SET OutputRoot.XMLNS.(XML.XmlDecl)*.(XML.Version)* = '1.0';
Auch wenn der XMLNS-Parser verwendet wird, gehören die Elementtypkonstanten zum XML-Parser. Dieser Code funktioniert, weil die vom XML- und XMLNS-Parser verwendeten Typwerte identisch sind. Beim XMLNSC-Parser sind die Typwerte jedoch anders, weshalb immer dessen eigene Typkonstanten verwendet werden müssen.
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';
//Rootknoten der XML-Domäne erstellen MBElement xmlRoot = root.createElementAsLastChild(MbXMLNSC.PARSER_NAME); //Übergeordneten Knoten der XML-Deklaration erstellen MbElement xmlDecl = xmlRoot.createElementAsFirstChild(MbXMLNSC.XML_DECLARATION); xmlDecl.setName("XmlDeclaration"); MbElement version = xmlDecl.CreateElementAsFirstChild(MbXMLNSC.ATTRIBUTE, "Version", "1.0"); MbElement encoding = xmlDecl.CreateElementAsFirstChild(MbXMLNSC.ATTRIBUTE, "Encoding", "utf-8"); //Nachrichtenhauptteil erstellen
<?xml version="1.0" encoding="utf_8"?>
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 in solchen Fällen für beide Nachrichtenflüsse den Kompaktparser.
Wenn für den Eingabe- und Ausgabenachrichtenfluss verschiedene Parser verwendet werden müssen, kann die explizite Angabe der Elementtypen in den Pfaden oder die Verwendung der FIELDVALUE-Funktion erforderlich sein, um statt untergeordneter Baumstrukturen eine Kopie von Skalarwerten sicherzustellen.
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
Syntaxelement | Korrelationsname | Konstanter Wert |
---|---|---|
Ordner | XMLNSC.Folder | 0x01000000 |
Dokumenttyp 1 | XMLNSC.DocumentType | 0x01000300 |
XML-Deklaration 2 | XMLNSC.XmlDeclaration | 0x01000400 |
Feld- oder Attributwert 3 | XMLNSC.Value | 0x02000000 |
PCData-Wert | XMLNSC.PCDataValue | 0x02000000 |
CData-Wert | XMLNSC.CDataValue | 0x02000001 |
Hybridwert | XMLNSC.HybridValue | 0x02000002 |
Entitätsverweis | XMLNSC.EntityReference | 0x02000100 |
Feld 3 | XMLNSC.Field | 0x03000000 |
PCData | XMLNSC.PCDataField | 0x03000000 |
CData | XMLNSC.CDataField | 0x03000001 |
Hybrid | XMLNSC.HybridField | 0x03000002 |
Attribut 3 | XMLNSC.Attribute | 0x03000100 |
Einfaches Anführungszeichen | XMLNSC.SingleAttribute | 0x03000101 |
Doppeltes Anführungszeichen | XMLNSC.DoubleAttribute | 0x03000100 |
Namespacedeklaration | XMLNSC.NamespaceDecl | 0x03000102 |
Einfaches Anführungszeichen | XMLNSC.SingleNamespaceDecl | 0x03000103 |
Doppeltes Anführungszeichen | XMLNSC.DoubleNamespaceDecl | 0x03000102 |
Bitstromdaten | XMLNSC.BitStream | 0x03000200 |
Einheitendefinition 1 3 | 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';
EntityDefinition und EntityReference mit dem XMLNSC-Parser verwenden
<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';
Das zweite Beispiel veranschaulicht die Erstellung einer Ausgabenachricht, die eine Entitätsdefinition und einen Verweis auf diese Entität enthält, wobei beides auf dem Inhalt derselben Eingabenachricht basiert.
<!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;
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);