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é.
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>
<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