Trabalhando com Mensagens e Fluxos de Bits MRM

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.

Por exemplo, suponha que seja utilizada a seguinte estrutura da mensagem:
          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.

Exemplo de Utilização da Função ASBITSTREAM e da Instrução CREATE com uma Cláusula PARSE em Modo FolderBitStream

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 de entrada:
<mensagem>
    <elem1>
        <elem11>value11</elem11>
        <elem12>
            <elem121>value121</elem121>
            <elem122>value122</elem122>
        </elem12>
        <elem13>value13</elem13>
    </elem1>
</message>
Mensagem de saída:
<mensagem>
    <elem1>
        <elem11>val11</elem11>
        <elem12>
            <elem121>VALUE121</elem121>
            <elem122>VALUE122</elem122>
        </elem12>
        <elem13>val13</elem13>
    </elem1
</message
Conceitos relacionados
Visão Geral de Fluxos de Mensagens
Visão Geral do ESQL
Modelagem de Mensagens
Tarefas relacionadas
Projetando um Fluxo de Mensagens
Definindo o Conteúdo do Fluxo de Mensagens
Gerenciando Arquivos ESQL
Desenvolvendo Modelos de Mensagens
Referências relacionadas
Nó Compute
Nó Database
Nó Filter
função ASBITSTREAM
Instrução CREATE
Instrução SET
Avisos | Marcas Registradas | Downloads | Biblioteca | Suporte | Feedback
Direitos Autorais IBM Corporation 1999, 2006 Última Atualização: 1 Sep 2006
ac20701_