Quando utilizar a função ASBITSTREAM ou a instrução CREATE FIELD com uma cláusula PARSE, lembre-se dos seguintes pontos.
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 definida no conjunto de mensagens ou pode ser uma mensagem auto definida, se estiver utilizando 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 forma, pode ser utilizado para recriar a árvore original, usando a 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 utilizados para recriar a árvore original utilizando uma instrução CREATE com uma cláusula PARSE (utilizando 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 utilizando a função ASBITSTREAM e, em seguida, utiliza 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 CAST(ASBITSTREAM(InputRoot.MRM.elem1.elem12 OPTIONS parseOptions SET 'DocSample' TYPE 'message/elem1/elem12' FORMAT 'XML1') AS BLOB); -- 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