Utilisation des messages MRM et des flux de bits

Lorsque vous utilisez la fonction ASBITSTREAM ou l'instruction CREATE FIELD avec une clause PARSE, vous devez tenir compte de diverses restrictions.

A propos de cette tâche

La fonction ASBITSTREAM

Si vous codez la fonction ASBITSTREAM avec l'option de mode analyseur définie sur RacineBitStream, pour analyser une arborescence de messages en un flux binaire, le résultat est un document MRM au format spécifié par le format de message qui est construit à partir des enfants de l'élément cible de la manière normale.

L'élément cible doit être un message prédéfini défini dans l'ensemble de messages ou peut être un message auto-défini si vous utilisez un format physique XML. Cet algorithme est identique à celui utilisé pour générer le flot de bits de sortie normal. Un flot de bits bien formé ainsi obtenu peut être utilisé pour recréer l'arborescence d'origine à l'aide d'une instruction CREATE avec une clause PARSE.

Si vous codez la fonction ASBITSTREAM avec l'option de mode analyseur définie sur DossierBitStream, pour analyser une arborescence de messages en un flux binaire, le flux binaire généré est un élément MRM construit à partir de l'élément cible et de ses enfants. Contrairement à RootBitStream En mode, l'élément cible n'a pas besoin de représenter un message ; il peut représenter un élément prédéfini dans un message ou un élément auto-défini dans un message.

Pour que l'analyseur MRM puisse analyser correctement le message, le chemin du message vers l'élément cible dans le message doit être spécifié dans le Type de message. Le format du chemin d'accès est identique à celui utilisé par les chemins d'accès aux messages, sauf que le préfixe de type de message n'est pas utilisé.

Par exemple, supposons que la structure de message suivante soit utilisée:
          Message
              elem1
                   elem11
                   elem12

Pour sérialiser la sous-arborescence représentant l'élément elem12 et ses enfants, spécifiez le chemin de message 'message/elem1/elem12' dans Type de message.

Si un élément du chemin est qualifié par un espace de nom, spécifiez l'URI de l'espace de nom entre { } caractères dans le chemin du message. Par exemple, si l'élément elem1 est qualifié par l'espace de nom 'http://www.ibm.com/temp', spécifiez le chemin du message sous la forme 'message/{http://www.ibm.com/temp}elem1/elem12'

Ce mode permet d'obtenir une description de flux binaire de sous-arbres arbitraires appartenant à un analyseur MRM. Dans ce mode, avec un format physique XML, le flot de bits XML généré n'est pas encadré par le'Nom de balise racine'spécifié pour le message dans l'ensemble de messages. Aucune déclaration XML n'est créée, même si elle n'est pas supprimée dans les propriétés de l'ensemble de messages.

Les flux binaires obtenus de cette manière peuvent être utilisés pour recréer l'arborescence d'origine en utilisant une instruction CREATE avec une clause PARSE (en utilisant un mode de FolderBitStream).

L'instruction CREATE avec une clause PARSE

Si vous codez une instruction CREATE avec une clause PARSE, avec l'option du mode analyseur définie sur RacineBitStream , pour analyser un flux binaire dans une arborescence de messages, le flux binaire attendu est un document MRM normal. Un champ de l'arborescence est créé pour chaque champ du document. Cet algorithme est identique à celui utilisé lors de l'analyse d'un flux de bits à partir d'un noeud d'entrée

Si vous codez une instruction CREATE avec une clause PARSE, avec l'option du mode analyseur définie sur DossierBitStream, pour analyser un flux binaire dans une arborescence de messages, le flux binaire attendu est un document au format spécifié par le format de message, qui est soit spécifié directement, soit hérité. Contrairement à RootBitStream en mode la racine du document ne doit pas nécessairement représenter un message MRM ; il peut représenter un élément prédéfini dans un message ou un élément auto-défini dans un message.

Pour que l'analyseur MRM puisse analyser correctement le message, le chemin du message vers l'élément cible dans le message doit être spécifié dans le Type de message. Le format du chemin de message est le même que celui utilisé pour la fonction ASBITSTREAM décrite ci-dessus.

Exemple d'utilisation de la fonction ASBITSTREAM et de l'instruction CREATE avec une clause PARSE dans FolderBitStream mode

Le langage ESQL suivant utilise la définition de message décrite ci-dessus. ESQL sérialise une partie de l'arborescence d'entrée à l'aide de la fonction ASBITSTREAM, puis utilise l'instruction CREATE avec une clause PARSE pour recréer la sous-arborescence dans l'arborescence de sortie. Le message d'entrée et le message de sortie correspondant sont affichés sous ESQL.

CREATE COMPUTE MODULE DocSampleFlow_Compute
	CREATE FUNCTION Main() RETURNS BOOLEAN
	BEGIN
		CALL CopyMessageHeaders();
		
		-- Set the options to be used by ASBITSTREAM and CREATE ... PARSE
		-- to be FolderBitStream and enable validation
		DECLARE parseOptions INTEGER BITOR(FolderBitStream, ValidateContent,
      							           ValidateValue, ValidateLocalError);

		-- Serialise the elem12 element and its children from the input bitstream
		-- into a variable
      	DECLARE subBitStream BLOB
        	ASBITSTREAM(InputRoot.MRM.elem1.elem12
        		 OPTIONS parseOptions
        		 SET 'DocSample'
        		 TYPE 'message/elem1/elem12'
        		 FORMAT 'XML1');

        -- Set the value of the first element in the output tree  		
       	SET OutputRoot.MRM.elem1.elem11 = 'val11';
       	
       	-- Parse the serialized sub-tree into the output tree
        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;
       	
		-- Convert the children of elem12 in the output tree to uppercase
		SET OutputRoot.MRM.elem1.elem12.elem121 =
			UCASE(OutputRoot.MRM.elem1.elem12.elem121);
			
		SET OutputRoot.MRM.elem1.elem12.elem122 =
			UCASE(OutputRoot.MRM.elem1.elem12.elem122);
			
        -- Set the value of the last element in the output tree  		
       	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 d'entrée:
<message>
    <elem1>
        <elem11>value11</elem11>
        <elem12>
            <elem121>value121</elem121>
            <elem122>value122</elem122>
        </elem12>
        <elem13>value13</elem13>
    </elem1>
</message>
Message de sortie:
<message>
    <elem1>
        <elem11>val11</elem11>
        <elem12>
            <elem121>VALUE121</elem121>
            <elem122>VALUE122</elem122>
        </elem12>
        <elem13>val13</elem13>
    </elem1
</message