Ao usar a função ASBITSTREAM ou a instrução CREATE FIELD com uma cláusula PARSE, é necessário considerar várias restrições.
A função ASBITSTREAM
Se você codificar a função ASBITSTREAM com a opção de modo do analisador configurada como RootBitStream, para analisar uma árvore de mensagens para um fluxo de bits, o resultado será um documento MRM no formato especificado pelo formato da mensagem construída a partir dos filhos do elemento de destino de forma normal.
O elemento de destino deve ser uma mensagem predefinida no conjunto de mensagens, ou pode ser uma mensagem autodefinida, se você estiver usando um formato físico XML. Esse algoritmo é idêntico ao utilizado para gerar o fluxo de bits de saída normal. Um fluxo de bits bem-formado obtido desta maneira pode ser usado para recriar a árvore original usando uma instrução CREATE com uma cláusula PARSE.
Se você codificar a função ASBITSTREAM com a opção de modo do analisador configurada como FolderBitStream, para analisar uma árvore de mensagens para um fluxo de bits, o fluxo de bits gerado será um elemento MRM construído a partir do elemento de destino e seus filhos. Diferente do modo RootBitStream, o elemento de destino não precisa representar uma mensagem; ele pode representar um elemento predefinido em uma mensagem ou um elemento autodefinido em uma mensagem.
Para que o analisador MRM possa analisar corretamente a mensagem, o caminho da mensagem para o elemento de destino na mensagem deve ser especificado em Tipo de Mensagem. O formato do caminho é o mesmo utilizado pelos caminhos de mensagens, exceto que o prefixo do tipo de mensagem não é utilizado.
Mensagem
elem1
elem11
elem12
Para serializar a subárvore que representa o elemento elem12 e seus filhos, especifique o caminho da mensagem 'message/elem1/elem12' no Tipo de Mensagem.
Se um elemento no caminho estiver qualificado por um espaço de nomes, especifique o URI do espaço de nomes entre os caracteres {} no caminho da mensagem. Por exemplo, se o elemento elem1 for qualificado pelo espaço de nomes 'http://www.ibm.com/temp', especifique o caminho da mensagem como 'message/{http://www.ibm.com/temp}elem1/elem12'
Este modo pode ser utilizado para obter uma descrição do fluxo de bits de subárvores arbitrárias pertencentes a um analisador MRM. Quando neste modo, com um formato físico de XML, o fluxo de bits XML gerado não está cercado pelo 'Nome da Tag Raiz' especificado para a Mensagem no Conjunto de Mensagens. Não é criada nenhuma declaração XML, mesmo que não seja suprimida nas propriedades do conjunto de mensagens.
Os fluxos de bits obtidos desta maneira podem ser usados para recriar a árvore original usando uma instrução CREATE com uma cláusula PARSE (usando um modo de FolderBitStream).
A instrução CREATE com uma cláusula PARSE
Se você codificar uma instrução CREATE com uma cláusula PARSE, com a opção de modo do analisador configurada como RootBitStream, para analisar um fluxo de bits para uma árvore de mensagens, o fluxo de bits esperado será um documento MRM normal. Cria-se um campo na árvore para cada campo no documento. Este algoritmo é idêntico ao utilizado durante a análise de um fluxo de bits a partir de um nó input
Se você codificar uma instrução CREATE com uma cláusula PARSE, com a opção de modo do analisador configurada como FolderBitStream, para analisar um fluxo de bits para uma árvore de mensagens, o fluxo de bits esperado será um documento no formato especificado pelo Formato da Mensagem, que é especificado diretamente ou herdado. Diferente do modo RootBitStream, a raiz do documento não precisa representar uma mensagem MRM; ela pode representar um elemento predefinido em uma mensagem ou um elemento autodefinido em uma mensagem.
Para que o analisador MRM possa analisar corretamente a mensagem, o caminho da mensagem para o elemento de destino na mensagem deve ser especificado em Tipo de Mensagem. O formato do caminho da mensagem é o mesmo utilizado para a função ASBITSTREAM descrita acima.
O ESQL a seguir utiliza a definição de mensagem descrita acima. O ESQL serializa parte da árvore de entrada usando a função ASBITSTREAM, em seguida, usa a instrução CREATE com uma cláusula PARSE para recriar a subárvore na árvore de saída. A mensagem de Entrada e a mensagem de Saída correspondentes são mostradas abaixo do ESQL.
CREATE COMPUTE MODULE DocSampleFlow_Compute
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
CALL CopyMessageHeaders();
-- Configure as opções a serem utilizadas por ASBITSTREAM e CREATE ... PARSE
-- para serem FolderBitStream e ative a validação
DECLARE parseOptions INTEGER BITOR(FolderBitStream, ValidateContent,
ValidateValue, ValidateLocalError);
-- Serialize o elemento elem12 e seus filhos a partir do fluxo de bits de entrada
-- para uma variável
DECLARE subBitStream BLOB
ASBITSTREAM(InputRoot.MRM.elem1.elem12
OPTIONS parseOptions
SET 'DocSample'
TYPE 'message/elem1/elem12'
FORMAT 'XML1');
-- Configure o valor do primeiro elemento na árvore de saída
SET OutputRoot.MRM.elem1.elem11 = 'val11';
-- Analise a subárvore serializada para a árvore de saída
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;
-- Converta os filhos de elem12 na árvore de saída em maiú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);
-- Configure o valor do último elemento na árvore de saída
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;
<mensagem>
<elem1>
<elem11>value11</elem11>
<elem12>
<elem121>value121</elem121>
<elem122>value122</elem122>
</elem12>
<elem13>value13</elem13>
</elem1>
</message>
<mensagem>
<elem1>
<elem11>val11</elem11>
<elem12>
<elem121>VALUE121</elem121>
<elem122>VALUE122</elem122>
</elem12>
<elem13>val13</elem13>
</elem1
</message