Mit MRM-Nachrichten und Bitströmen arbeiten

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.

Angenommen, es wird beispielsweise folgende Nachrichtenstruktur verwendet:
          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.

Beispiel der Verwendung der ASBITSTREAM-Funktion und der CREATE-Anweisung mit einer PARSE-Klausel im Modus 'FolderBitStream'

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;
Eingabenachricht:
<message>
    <elem1>
        <elem11>value11</elem11>
        <elem12>
            <elem121>value121</elem121>
            <elem122>value122</elem122>
        </elem12>
        <elem13>value13</elem13>
    </elem1>
</message>
Ausgabenachricht:
<message>
    <elem1>
        <elem11>val11</elem11>
        <elem12>
            <elem121>VALUE121</elem121>
            <elem122>VALUE122</elem122>
        </elem12>
        <elem13>val13</elem13>
    </elem1
</message
Zugehörige Konzepte
Nachrichtenflüsse - Übersicht
Übersicht zu ESQL
Nachrichten modellieren
Zugehörige Tasks
Einen Nachrichtenfluss entwerfen
Nachrichtenflussinhalte definieren
ESQL-Dateien verwalten
Nachrichtenmodelle entwickeln
Zugehörige Verweise
Rechenknoten (Compute)
Datenbankknoten (Database)
Filterknoten
ASBITSTREAM-Funktion
CREATE-Anweisung
SET-Anweisung
Bemerkungen | Marken | Downloads | Bibliothek | Unterstützung | Rückmeldung
Copyright IBM Corporation 1999, 2006 Letzte Aktualisierung: 23. Aug. 2006
ac20701_