Al utilizar la función ASBITSTREAM o la sentencia CREATE FIELD con una cláusula PARSE, tenga en cuenta los puntos siguientes.
Función ASBITSTREAM
Si codifica la función ASBITSTREAM con la opción de modalidad de analizador establecida en RootBitStream, para analizar un árbol de mensaje en una corriente de bits, el resultado es un documento MRM en el formato especificado por el formato de mensaje que se crea desde los hijos del elemento de destino de la forma normal.
El elemento de destino debe ser un mensaje definido previamente en el conjunto de mensajes o puede ser un mensaje autodefinido si se utiliza un formato físico XML. Este algoritmo es idéntico al utilizado para generar la corriente de bits de salida normal. Se puede utilizar una corriente de bits de formato correcto obtenida de este modo para volver a crear el árbol original utilizando una sentencia CREATE con una cláusula PARSE.
Si codifica la función ASBITSTREAM con la opción de modalidad de analizador establecida en FolderBitStream, para analizar un árbol de mensaje en una corriente de bits, la corriente de bits generada es un elemento MRM creado desde el elemento de destino y sus hijos. A diferencia de la modalidad RootBitStream, el elemento de destino no tiene que representar un mensaje; puede representar un elemento predefinido en un mensaje o un elemento autodefinido dentro de un mensaje.
Para que el analizador MRM pueda analizar correctamente el mensaje, la vía de acceso del mensaje al elemento de destino dentro del mensaje se debe especificar en el Tipo de mensaje. El formato de la vía de acceso es el mismo que el utilizado por las vías de acceso de mensaje excepto en que no se utiliza el prefijo de tipo de mensaje.
Message elem1 elem11 elem12
Para serializar el subárbol que representa el elemento elem12 y sus hijos, especifique la vía de acceso de mensaje 'message/elem1/elem12' en el tipo de mensaje.
Si un elemento de la vía de acceso se califica mediante un espacio de nombres, especifique el URI de espacio de nombres entre caracteres {} en la vía de acceso de mensaje. Por ejemplo, si el elemento elem1 se califica mediante el espacio de nombres 'http://www.ibm.com/temp', especifique la vía de acceso de mensaje como 'message/{http://www.ibm.com/temp}elem1/elem12'
Esta modalidad se puede utilizar para obtener una descripción de corriente de bits de subárboles arbitrarios que son propiedad de un analizador MRM. Cuando se está en esta modalidad, con un formato físico de XML, la corriente de bits XML generada no está entre el 'Nombre de código raíz' especificado para el mensaje en el conjunto de mensajes. No se crea ninguna declaración XML, incluso si no se suprime en las propiedades de conjunto de mensajes.
Se pueden utilizar las corrientes de bits obtenidas de este modo para volver a crear el árbol original utilizando una sentencia CREATE con una cláusula PARSE (utilizando una modalidad de FolderBitStream).
La sentencia CREATE con una cláusula PARSE
Si codifica una sentencia CREATE con una cláusula PARSE, con la opción de modalidad de analizador establecida en RootBitStream, para analizar una corriente de bits en un árbol de mensaje, la corriente de bits esperada será un documento MRM normal. Para cada campo del documento se crea un campo en el árbol. Este algoritmo es idéntico al utilizado al analizar una corriente de bits desde un nodo de entrada
Si codifica una sentencia CREATE con una cláusula PARSE, con la opción de modalidad de analizador establecida en FolderBitStream, para analizar una corriente de bits en un árbol de mensaje, la corriente de bits esperada es un documento en el formato especificado por el Formato de mensaje, que se especifica directamente o se hereda. A diferencia de la modalidad RootBitStream, la raíz del documento no tiene que representar un mensaje MRM; puede representar un elemento predefinido dentro de un mensaje o un elemento autodefinido dentro de un mensaje.
Para que el analizador MRM pueda analizar correctamente el mensaje, se debe especificar la vía de acceso del mensaje al elemento de destino del mensaje en el Tipo de mensaje. El formato de la vía de acceso de mensaje es el mismo que el utilizado para la función ASBITSTREAM que se describe más arriba.
El siguiente ESQL utiliza la definición de mensaje descrita más arriba. El ESQL serializa parte del árbol de entrada utilizando la función ASBITSTREAM y, a continuación, utiliza la sentencia CREATE con una cláusula PARSE para volver a crear el subárbol en el árbol de salida. El mensaje de entrada y el mensaje de salida correspondiente se muestran bajo el ESQL.
CREATE COMPUTE MODULE DocSampleFlow_Compute CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN CALL CopyMessageHeaders(); -- Establecer que las opciones que ASBITSTREAM and CREATE ... PARSE utilizará -- sean FolderBitStream y habilitar la validación DECLARE parseOptions INTEGER BITOR(FolderBitStream, ValidateContent, ValidateValue, ValidateLocalError); -- Serializar el elemento elem12 y los hijos desde la corriente de bits de entrada -- en una variable DECLARE subBitStream BLOB CAST(ASBITSTREAM(InputRoot.MRM.elem1.elem12 OPTIONS parseOptions SET 'DocSample' TYPE 'message/elem1/elem12' FORMAT 'XML1') AS BLOB); -- Establecer el valor del primer elemento del árbol de salida SET OutputRoot.MRM.elem1.elem11 = 'val11'; -- Analizar el subárbol serializado en el árbol de salida 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; -- Convertir los hijos de elem12 del árbol de salida a mayúsculas SET OutputRoot.MRM.elem1.elem12.elem121 = UCASE(OutputRoot.MRM.elem1.elem12.elem121); SET OutputRoot.MRM.elem1.elem12.elem122 = UCASE(OutputRoot.MRM.elem1.elem12.elem122); -- Establecer el valor del último elemento del árbol de salida 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