Manipulando Mensagens Utilizando o Analisador XMLNSC

O domínio XMLNSC é uma extensão do domínio XMLNS que, por sua vez, era uma extensão do domínio original XML.

A intenção com o domínio XMLNS era incluir suporte a espaço de nomes e, por motivo de compatibilidade, foi criado um novo domínio para que os aplicativos existentes não fossem afetados. A intenção com o novo domínio XMLNSC é construir uma árvore mais compacta e, portanto, utilizar menos memória ao manipular mensagens grandes. Novamente, por motivo de compatibilidade, foi incluído um novo domínio para que os aplicativos existentes não sejam afetados.

Estrutura da Árvore de Mensagens

O analisador XMLNSC obtém sua árvore mais compacta utilizando um único elemento nome-valor para representar o texto com tag, em vez do nome separado e os elementos de valor utilizados pelos analisadores XML e XMLNS. Considere a seguinte mensagem:
    <Folder1>
        <Folder2 Attribute1='AttributeValue1'>
            <Field1><Value1></Field1>
            <Field2 Attribute2='AttributeValue2'><Value2></Field2>
        </Folder2>
    </Folder1>

No domínio XMLNSC, isto é representado por dois elementos de nome (Folder1 e Folder2) e por quatro elementos nome-valor que são Attribute1, Field1, Field2 e Attribute2.

Os domínios XML e XMLNS se diferem no sentido de que cada um dos dois campos é representado por um elemento de nome com um elemento de valor-filho. Isto pode parecer uma pequena diferença, mas as mensagens geralmente possuem muitos campos de folhas; por exemplo:
    <Folder1>
        <Folder2>
            <Field1><Value1></Field1>
            <Field2><Value2></Field2>
            ....
            <Field100><Value100></Field100>
        </Folder2>
    </Folder1>

Neste caso, o analisador XMLNSC representa a mensagem por dois elementos de nome e 100 elementos nome-valor, enquanto os analisadores XML e XMLNS utilizariam 102 elementos de nome e 100 elementos de valor, mais 103 elementos de valor adicionais para representar o espaço em branco implícito em mensagens formatadas.

Atributos e Texto com Tag

Como os atributos e texto com tag são representados por elementos nome-valor, eles são diferenciados pela utilização dos tipos de elementos. Se não for especificado um tipo, será assumido o texto com tag. Portanto, a primeira mensagem de exemplo acima pode ser produzida pelas instruções SQL:
    SET Origin.Folder1.Folder2.(XMLNSC.Attribute)Attribute1 =
       'AttributeValue1';
    SET Origin.Folder1.Folder2.Field1 = ‘Value1’;
    SET Origin.Folder1.Folder2.(XMLNSC.Attribute)Attribute2 =
       'AttributeValue2';
    SET Origin.Folder1.Folder2.Field2 = ‘Value2’;

Embora o SQL precedente pareça ser quase idêntico ao que seria utilizado com o analisador XML, observe especificamente que as constantes de tipo que estão sendo utilizadas são as pertencentes ao analisador XMLNSC. A utilização de constantes pertencentes a outros analisadores, por exemplo, XML, conduz a resultados inesperados, pois as constantes com nomes semelhantes, como por exemplo, XML.Attribute, possuem valores diferentes.

Manipulando o Texto Misto

Por padrão, o texto misto é simplesmente descartado porque, se presente, ele apenas estará formatando e não terá nenhum significado.

No entanto, é fornecido um modo que, durante a análise, qualquer texto diferente que ocorra entre uma tag de abertura e uma tag de fechamento (ou seja, open->open, close->close e close->open) será representado por um único elemento de Valor. Os tipos de elementos de valor suportam PCDATA, CDATA e híbrido, que é uma mistura dos dois precedentes.

Ainda não existe nenhum comportamento especial de elemento de sintaxe referente à obtenção e configuração de valores. Os elementos de Valor podem ser acessados apenas a partir do SQL por abordagem explícita. São fornecidas as seguintes constantes extras para esta finalidade:
   XMLNSC.Value
   XMLNSC.PCDataValue
   XMLNSC.CDataValue
   XMLNSC.HybridValue
O modo é controlado pelos novos valores da opção de mensagem. Para esta finalidade, são fornecidas as seguintes constantes:
   XMLNSC.MixedContentRetainNone = 0x0000000000000000
   XMLNSC.MixedContentRetainAll  = 0x0001000000000000
Estas constantes podem ser utilizadas nas cláusulas Option da SQL Instrução CREATE (seção PARSE) e da função ASBITSTREAM. Por exemplo:
   DECLARE X BLOB ASBITSTREAM(InputRoot.XMLNSC.Data OPTIONS
   XMLNSC.MixedContentRetainAll);
   ...
   CREATE LASTCHILD OF outputRoot PARSE(X OPTIONS
   XMLNSC.MixedContentRetainNone);

Manipulando Comentários

Por padrão, os comentários também serão simplesmente descartados porque, se presentes, eles são apenas informações auxiliares sem nenhum significado.

No entanto, é fornecido um modo no qual, durante a análise, os comentários que ocorrem no documento (diferentes dos comentários na própria descrição do documento) são representados por um elemento nome-valor com o nome Comentário. É fornecido o seguinte comentário extra para esta finalidade.
   XMLNSC.Comment
O modo é controlado pelos novos valores da opção de mensagem. São fornecidas as seguintes constantes para esta finalidade:
   XMLNSC.CommentsRetainNone = 0x0000000000000000
   XMLNSC.CommentsRetainAll  = 0x0002000000000000
Por exemplo:
   DECLARE X BLOB ASBITSTREAM(InputRoot.XMLNSC.Data OPTIONS
   XMLNSC.CommentsRetainAll);
   ...
   CREATE LASTCHILD OF outputRoot PARSE(X OPTIONS XMLNSC.CommentsRetainNone);

Manipulando Instruções de Processamento

Por padrão, as instruções de processamento também serão simplesmente descartadas porque, se presentes, elas são apenas informações auxiliares sem nenhum significado.

No entanto, é fornecido um modo no qual, durante a análise, as instruções de processamento que ocorrem no documento (diferentes das que ocorrem na própria descrição do documento) serão representadas por um elemento nome-valor com o nome e valor apropriados. É fornecida a seguinte constante extra para esta finalidade:
    XMLNSC.ProcessingInstruction
O modo é controlado pelos novos valores da opção de mensagem. São fornecidas as seguintes constantes para esta finalidade:
    XMLNSC.ProcessingInstructionsRetainNone = 0x0000000000000000
    XMLNSC.ProcessingInstructionsRetainAll  = 0x0004000000000000
Por exemplo:
    DECLARE X BLOB ASBITSTREAM(InputRoot.XMLNSC.Data
    OPTIONS XMLNSC.ProcessingInstructionsRetainAll);
    ...
    CREATE LASTCHILD OF outputRoot PARSE(X OPTIONS
    XMLNSC.ProcessingInstructionsRetainNone);

Migrando um Fluxo Existente

O fato é que foi introduzido um novo domínio significando que, ao utilizar o analisador XMLNSC, é necessário recodificar o ESQL para utilizar XMLNSC em seus caminhos. Considere os seguintes exemplos:
SET OutputRoot.XML.Person.Salary    = CAST(InputRoot.XML.Person.Salary AS INTEGER) * 3;
SET OutputRoot.XMLNS.Person.Salary  = CAST(InputRoot.XMLNS.Person.Salary AS INTEGER) * 3;
SET OutputRoot.XMLNSC.Person.Salary = CAST(InputRoot.XMLNSC.Person.Salary AS INTEGER) * 3;
Em cada caso, o fluxo de bits XML esperado na fila de entrada e gravado na fila de saída tem o formato:
    <Person><Salary>42</Salary></Person>

Os três casos se diferem no sentido de que estão utilizando diferentes analisadores para possuírem estes elementos. Portanto, é esperado um nome de domínio diferente no cabeçalho MQRFH2 da mensagem que chega e um nome de domínio diferente foi gravado no cabeçalho MQRFH2 da mensagem que sai.

Para proteger aplicativos externos destas alterações, a propriedade Utilizar Analisador Compacto XMLNSC para o Domínio XMLNS pode ser especificada no nó de entrada do fluxo e no nó Compute que contém estas instruções.

O primeiro exemplo faz o analisador XMLNSC ser utilizado para analisar o corpo da mensagem quando o cabeçalho MQRFH2 na mensagem que chega especificar o domínio XMLNS; o do nó Compute faz o MQRFH2 de saída especificar o analisador XMLNS em vez do XMLNSC, portanto, permitindo que as mensagens de entrada e de saída permaneçam inalteradas.

Se as mensagens que chegam não contiverem cabeçalhos MQRFH2 e o atributo do domínio de mensagem do nó de entrada estiver sendo utilizado para especificar o domínio, será possível configurá-lo como XMLNSC ou configurá-lo como XMLNS e também configurar a propriedade Utilizar Analisador Compacto XMLNSC para o Domínio XMLNS.

Se as mensagens que saem não contiverem cabeçalhos MQRFH2, o domínio não aparecerá em nenhum lugar nas mensagens de saída e a configuração da propriedade Utilizar Analisador Compacto XMLNSC para o Domínio XMLNS do nó Compute não terá efeito

Construindo Cabeçalhos XML

O ESQL a seguir é válido no domínio XML:
SET OutputRoot.XML.(XML.XmlDecl)*.(XML.Version)* = '1.0';
Para migrar para XMLNS, alterar apenas a raiz é suficiente para fazer este trabalho:
SET OutputRoot.XMLNS.(XML.XmlDecl)*.(XML.Version)* = '1.0';

Observe que, embora o analisador XMLNS esteja sendo utilizado, as constantes do tipo de elemento são as pertencentes ao analisador XML. Isto funciona porque os valores de tipos utilizados pelos analisadores XML e XMLNS são os mesmos. No entanto, para o analisador XMLNSC, os valores de tipos são diferentes e, portanto, é necessário sempre utilizar suas próprias constantes de tipo.

No domínio XMLNSC, não existe nenhum tipo especial para a versão XML; ele é tratado apenas como um atributo da declaração XML. A sintaxe equivalente para o exemplo acima é:
SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)Version = '1.0';

Copiando Árvores de Mensagens

Ao copiar árvores, o intermediário considera XML e XMLNSC como analisadores diferentes, o que significa que todos os atributos na árvore de origem são mapeados para elementos na árvore de destino. Esta situação ocorrerá apenas se você estiver utilizando os dois analisadores no mesmo fluxo - um para entrada e um para saída; portanto, é recomendável utilizar o analisador compacto para os dois fluxos.

Se for necessário utilizar analisadores diferentes para o fluxo de entrada e o fluxo de saída, será preciso especificar explicitamente os tipos de elementos nos caminhos ou utilizar a Função FIELDVALUE para assegurar uma cópia de valores escalares em vez de subárvores.

Siga a orientação fornecida para mensagens XML em Manipulando Mensagens no Domínio XML, em conjunto com as informações no tópico Manipulando o Conteúdo do Corpo da Mensagem.

Acessando elementos de sintaxe no domínio XMLNSC utilizando nomes de correlação

A tabela a seguir fornece os nomes de correlação para cada elemento de sintaxe XML. Ao trabalhar no domínio XMLNSC, utilize esses nomes para fazer referência aos elementos nas mensagens de entrada e para configurar elementos, atributos e valores nas mensagens de saída.
Tabela 1. Nomes de Correlação para Elementos de Sintaxe XML
Elemento de Sintaxe Nome de Correlação Valor Constante
Pasta XMLNSC.Folder 0x01000000
Tipo de Documento 1 XMLNSC.DocumentType 0x01000300
Declaração XML 2 XMLNSC.XmlDeclaration 0x01000400
     
Valor de Campo ou de Atributo XMLNSC.Value 0x02000000
Valor de PCData XMLNSC.PCDataValue 0x02000000
Valor de CData XMLNSC.CDataValue 0x02000001
Valor Híbrido XMLNSC.HybridValue 0x02000002
     
Referência de Entidade XMLNSC.EntityReference 0x02000100
     
Campo XMLNSC.Field 0x03000000
PCData XMLNSC.PCDataField 0x03000000
CData XMLNSC.CDataField 0x03000001
Híbrido XMLNSC.HybridField 0x03000002
     
Atributo XMLNSC.Attribute 0x03000100
Aspas Simples XMLNSC.SingleAttribute 0x03000101
Aspas Duplas XMLNSC.DoubleAttribute 0x03000100
     
Declaração de Espaço de Nomes XMLNSC.NamespaceDecl 0x03000102
Aspas Simples XMLNSC.SingleNamespaceDecl 0x03000103
Aspas Duplas XMLNSC.DoubleNamespaceDecl 0x03000102
     
Dados de Fluxo de Bits XMLNSC.BitStream 0x03000200
     
Definição de Entidade 1 XMLNSC.EntityDefinition 0x03000300
Aspas Simples XMLNSC.SingleEntityDefinition 0x03000301
Aspas Duplas XMLNSC.DoubleEntityDefinition 0x03000300
     
Comentário XMLNSC.Comment 0x03000400
     
Instrução de Processamento XMLNSC.ProcessingInstruction 0x03000401
Notas:
  1. Tipo de Documento é utilizado somente para definições de entidade. Exemplo:
    SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)BodyDocument.(XMLNSC.EntityDefinition)TestDef =
     		          'Compact Tree Parser XML Test Module Version 1.0';
  2. Observe que a declaração XML é um tipo de pasta especial que contém os elementos filho para a versão e assim por diante. Exemplo:
    -- Criar a declaração XML 		
    SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.Version = 1.0;
    SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.Encoding = 'UTF8';
    SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.Standalone = 'yes';

Modos de analisador XMLNSC

Por padrão, o analisador XMLNSC descarta elementos de documentos que geralmente não carregam nenhum significado de negócios. No entanto, os modos de analisador estão disponíveis para forçar a retenção desses elementos. É possível configurar esses modos nas propriedades do nó que especifica que a mensagem deve ser analisada no domínio XMLNSC.

Os modos de analisador válidos para o analisador XMLNSC são:
XMLNSC.MixedContentRetainNone
XMLNSC.MixedContentRetainAll
XMLNSC.CommentsRetainNone
XMLNSC.CommentsRetainAll
XMLNSC.ProcessingInstructionsRetainNone
XMLNSC.ProcessingInstructionsRetainAll
O exemplo a seguir utiliza os modos XMLNSC.ProcessingInstructionsRetainAll e XMLNSC.ProcessingInstructionsRetainNone para reter instruções de processamento de documentos durante a análise:
DECLARE X BLOB ASBITSTREAM(InputRoot.XMLNSC.Data OPTIONS XMLNSC.ProcessingInstructionsRetainAll);
...     
CREATE LASTCHILD OF outputRoot PARSE(X OPTIONS XMLNSC.ProcessingInstructionsRetainNone);
Conceitos relacionados
Visão Geral de Fluxos de Mensagens
Analisadores e Domínios XML
Visão Geral do ESQL
Tarefas relacionadas
Projetando um Fluxo de Mensagens
Definindo o Conteúdo do Fluxo de Mensagens
Manipulando Mensagens no Domínio XML
Referências relacionadas
Referência de ESQL
Instrução SET
Função FIELDVALUE
função ASBITSTREAM
Instrução CREATE
Avisos | Marcas Registradas | Downloads | Biblioteca | Suporte | Feedback
Direitos Autorais IBM Corporation 1999, 2005 Última Atualização: 04/11/2005
ac26040_