Wenn Sie die Funktion ASBITSTREAM oder die Anweisung CREATE FIELD mit einer PARSE-Klausel verwenden, müssen Sie die folgenden Punkte beachten.
Die ASBITSTREAM-Funktion
Wenn Sie bei der Codierung der ASBITSTREAM-Funktion die Parser-Modusoption für die Syntaxanalyse einer Nachrichtenbaumstruktur in einen Bitstrom auf RootBitStream setzen, wird ein MRM-Dokument in dem Format ausgegeben, das durch das Nachrichtenformat angegeben ist und auf die übliche Weise auf Basis der untergeordneten Elemente des Zielelements erstellt wird.
Das Zielelement muss eine vordefinierte Nachricht innerhalb der Nachrichtengruppe sein oder kann eine selbstdefinierende Nachricht sein, wenn ein physisches XML-Format verwendet wird. Dieser Algorithmus ist identisch mit dem, der für die Generierung des üblichen Ausgabebitstroms verwendet wird. Sie können einen korrekt formatierten Bitstrom verwenden, der auf diese Weise erhalten wurde, um die ursprüngliche Baumstruktur mit Hilfe einer CREATE-Anweisung und einer PARSE-Klausel erneut zu erstellen.
Wenn Sie bei der Codierung der ASBITSTREAM-Funktion die Parser-Modusoption für die Syntaxanalyse einer Nachrichtenbaumstruktur in einen Bitstrom auf FolderBitStream setzen, entspricht der generierte Bitstrom einem MRM-Element, das auf Basis des Zielelements und dessen untergeordneten Elementen erstellt wird. Im Gegensatz zum Modus RootBitStream muss das Zielelement keine Nachricht repräsentieren; es kann ein vordefiniertes oder selbstdefinierendes Element innerhalb einer Nachricht darstellen.
Damit die Nachricht vom MRM-Parser korrekt syntaktisch analysiert werden kann, muss der Pfad von der Nachricht zum Zielelement innerhalb der Nachricht in der Nachrichtenart angegeben werden. Das Format des Pfades ist mit dem Format identisch, das von den Nachrichtenpfaden verwendet wird, außer dass das Nachrichtentyp-Präfix nicht verwendet wird.
Nachricht elem1 elem11 elem12
Zur seriellen Verarbeitung der Unterverzeichnisstruktur, die das Element elem12 und dessen untergeordnete Elemente darstellt, müssen Sie den Nachrichtenpfad 'message/elem1/elem12' in der Nachrichtenart angeben.
Wenn ein Element im Pfad durch einen Namensbereich näher bestimmt wird, müssen Sie die URI des Namensbereichs im Nachrichtenpfad zwischen die Zeichen {} setzen. Wenn beispielsweise das Element elem1 durch den Namensbereich 'http://www.ibm.com/temp' näher bestimmt wird, müssen Sie den Nachrichtenpfad als 'message/{http://www.ibm.com/temp}elem1/elem12' angeben.
Verwenden Sie diesen Modus, um eine Bitstrombeschreibung beliebiger untergeordneter Baumstrukturen zu erhalten, deren Eigner ein MRM-Parser ist. In diesem Modus wird der generierte XML-Bitstrom bei dem physischen XML-Format nicht in den 'Root-Befehlsnamen' eingeschlossen, der für die Nachricht in der Nachrichtengruppe angegeben wird. Es wird keine XML-Deklaration erstellt, selbst wenn dies in den Eigenschaften der Nachrichtengruppe nicht unterdrückt wurde.
Sie können Bitströme verwenden, die auf diese Weise erhalten wurden, um die ursprüngliche Baumstruktur mit Hilfe einer CREATE-Anweisung mit einer PARSE-Klausel (unter Verwendung des Modus FolderBitStream) erneut zu erstellen.
Die CREATE-Anweisung mit einer PARSE-Klausel
Wenn Sie eine CREATE-Anweisung mit einer PARSE-Klausel codieren, bei der die Parser-Modusoption für die Syntaxanalyse eines Bitstroms in eine Nachrichtenbaumstruktur auf RootBitStream gesetzt ist, handelt es sich bei dem erwarteten Bitstrom um ein normales MRM-Dokument. Für jedes Feld im Dokument wird ein Feld in der Baumstruktur erstellt. Dieser Algorithmus ist identisch mit dem, der für die Syntaxanalyse eines Bitstroms auf Basis eines Empfangsknotens verwendet wird.
Wenn Sie eine CREATE-Anweisung mit einer PARSE-Klausel codieren, bei der die Parser-Modusoption für die Syntaxanalyse eines Bitstroms in eine Nachrichtenbaumstruktur auf FolderBitStream gesetzt ist, handelt es sich bei dem erwarteten Bitstrom um ein Dokument in dem Format, das durch das Nachrichtenformat angegeben ist. Dieses wird entweder direkt angegeben oder übernommen. Im Gegensatz zum Modus RootBitStream muss das Stammverzeichnis des Dokuments keine MRM-Nachricht repräsentieren; es kann ein vordefiniertes oder selbstdefinierendes Element innerhalb einer Nachricht darstellen.
Damit die Nachricht vom MRM-Parser korrekt syntaktisch analysiert werden kann, muss der Pfad von der Nachricht zum Zielelement innerhalb der Nachricht in der Nachrichtenart angegeben werden. Das Format des Pfades ist mit dem Format identisch, das für die oben beschriebene ASBITSTREAM-Funktion verwendet wird.
Im folgenden ESQL-Code wird die oben beschriebene Nachrichtendefinition verwendet. Der ESQL-Code serialisiert mit Hilfe der Funktion ASBITSTREAM einen Teil der Eingabebaumstruktur und erstellt dann erneut mit der CREATE-Anweisung und einer PARSE-Klausel die Unterverzeichnisstruktur in der Ausgabebaumstruktur. Die Eingabenachricht sowie die entsprechende Ausgabenachricht werden unterhalb des ESQL-Codes angezeigt.
CREATE COMPUTE MODULE DocSampleFlow_Compute CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN CALL CopyMessageHeaders(); -- Festlegung, dass für die von ASBITSTREAM und CREATE ... PARSE verwendeten -- Optionen 'FolderBitStream' angenommen und die Auswertung aktiviert wird DECLARE parseOptions INTEGER BITOR(FolderBitStream, ValidateContent, ValidateValue, ValidateLocalError); -- Serielle Verarbeitung des Elements 'elem12' und dessen untergeordneten Elementen aus dem -- Eingabebitstrom in einer Variablen DECLARE subBitStream BLOB CAST(ASBITSTREAM(InputRoot.MRM.elem1.elem12 OPTIONS parseOptions SET 'DocSample' TYPE 'message/elem1/elem12' FORMAT 'XML1') AS BLOB); -- Festlegung des Werts des ersten Elements in der Ausgabebaumstruktur SET OutputRoot.MRM.elem1.elem11 = 'val11'; -- Syntaxanalyse der serialisierten Unterverzeichnisstruktur in der Ausgabebaumstruktur IF subBitStream IS NOT NULL THEN CREATE LASTCHILD OF OutputRoot.MRM.elem1 PARSE ( subBitStream OPTIONS parseOptions SET 'DocSample' TYPE 'message/elem1/elem12' FORMAT 'XML1'); END IF; -- Konvertierung der untergeordneten Elemente von elem12 in der Ausgabebaumstruktur in Großbuchstaben SET OutputRoot.MRM.elem1.elem12.elem121 = UCASE(OutputRoot.MRM.elem1.elem12.elem121); SET OutputRoot.MRM.elem1.elem12.elem122 = UCASE(OutputRoot.MRM.elem1.elem12.elem122); -- Festlegung des Werts des letzten Elements in der Ausgabebaumstruktur SET OutputRoot.MRM.elem1.elem13 = 'val13'; RETURN TRUE; END; CREATE PROCEDURE CopyMessageHeaders() BEGIN DECLARE I INTEGER 1; DECLARE J INTEGER CARDINALITY(InputRoot.*[]); WHILE I < J DO SET OutputRoot.*[I] = InputRoot.*[I]; SET I = I + 1; END WHILE; END; END MODULE;
<message> <elem1> <elem11>value11</elem11> <elem12> <elem121>value121</elem121> <elem122>value122</elem122> </elem12> <elem13>value13</elem13> </elem1> </message>
<message> <elem1> <elem11>val11</elem11> <elem12> <elem121>VALUE121</elem121> <elem122>VALUE122</elem122> </elem12> <elem13>val13</elem13> </elem1 </message