Manipulando Mensagens Utilizando o Analisador XMLNSC

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

O domínio XMLNS inclui suporte ao espaço de nomes. O novo domínio XMLNSC constrói uma árvore mais compacta e, portanto, utiliza menos memória ao manipular grandes mensagens. Um novo domínio foi incluído de forma que aplicativos existente 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, isso é representado por dois elementos de nome (Folder1 e Folder2) e quatro elementos nome-valor, que são Attribute1, Field1, Field2 e Attribute2.

Início da mudançaOs domínios XML e XMLNS diferem sendo cada um dos dois campos (Field1 e Field2)Fim da mudança 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.

Início da mudançaOs domínios XML e XMLNS criam elementos nome-valor para os caracteres de formatação espaço em branco entre a abertura e o fechamento de cada pasta ou campo. Esses elementos espaço em branco têm um nome vazio e um valor para o espaço, tabulação, alimentação de linha ou outros caracteres utilizados na formatação do documento XML. Esses elementos não têm nenhum valor útil e podem, portanto, ser descartados para melhorar a compactação. Pela mesma razão, o comportamento padrão é descartar quaisquer instruções e comentários de processamento de XML no fluxo de entrada e não criar nenhum elemento na árvore de domínio compacto.Fim da mudança

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’;

Apesar de o ESQL anterior parecer quase idêntico ao utilizado com o analisador de XML, observe principalmente que as constantes de tipo pertencem ao analisador de XMLNSC. A utilização de constantes que pertencem a outros analisadores, por exemplo, XML, leva a resultados inesperados, pois constantes denominadas de forma semelhante, por exemplo, XML.Attribute, têm valores diferentes.

Início da mudançaAs constantes a seguir são definidas no domínio XMLNSC para a criação de atributos:
   XMLNSC.SingleAttribute   XMLNSC.DoubleAttribute
Fim da mudança
Início da mudançaA constante a seguir é definida no domínio XMLNSC para seleção de atributos:
   XMLNSC.Attribute
Fim da mudança
Início da mudançaConsidere a seguinte mensagem de entrada XML:
    <Folder1 Item='ValueA'>
        <Item>Value1</Item>
    </Folder1>
Fim da mudança
Início da mudançaPara remover a ambigüidade do nome Item utilizado como um nome de atributo e um nome de campo em Folder01, o seguinte ESQL pode ser utilizado:
    SET ItemAttributeValueHolder = InputRoot.XMLNSC.Folder1.(XMLNSC.Attribute)Item;
    SET ItemFieldValueHolder = InputRoot.XMLNSC.Folder1.(XMLNSC.Field)Item;
Fim da mudança

Esse método tem uma vantagem sobre a utilização da seleção do índice da matriz com Folder1 já que não é afetado se o atributo não estiver presente no fluxo de entrada.

Manipulando o Texto Misto

Início da mudançaPor padrão, o texto misto é simplesmente descartado com base em que, se presente, ele é geralmente simplesmente espaço em branco de formatação e não tem nenhum significado para o negócio.Fim da mudança

No entanto, um modo é fornecido, no qual, ao analisar, qualquer texto que ocorre que não entre uma tag de abertura e uma tag de fechamento (ou seja, open->open, close->close e close->open) Início da mudançaé representado por um único elemento Value não denominado.Fim da mudança 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
Início da mudançaO modo é controlado pela configuração do Modo de Retenção de Conteúdo Misto no navegador do diálogo de propriedade Opções do Analisador XMLNSC em todos os nós de análise de mensagens, por exemplo, o nó MQInput. Para o controle programático utilizando opções de mensagens, as seguintes constantes são fornecidas:Fim da mudança
   XMLNSC.MixedContentRetainNone = 0x0000000000000000
   XMLNSC.MixedContentRetainAll  = 0x0001000000000000
Essas constantes podem ser utilizadas nas cláusulas Option de SQL Instrução CREATE (seção PARSE) e 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.

Início da mudançaNo 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. A constante extra a seguir é fornecida para essa finalidade.
   XMLNSC.Comment
Fim da mudança
Início da mudançaO modo é controlado pela configuração do Modo de Retenção de Comentários no navegador do diálogo de propriedade Opções do Analisador XMLNSC em todos os nós de análise de mensagens, por exemplo, o nó MQInput. Para o controle programático utilizando opções de mensagens, as seguintes constantes são fornecidas:Fim da mudança
   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
Início da mudançaO modo é controlado pela configuração do Modo de Retenção de Instruções de Processamento no navegador do diálogo de propriedade Opções do Analisador XMLNSC em todos os nós de análise de mensagens, por exemplo, o nó MQInput. Para o controle programático utilizando opções de mensagens, as seguintes constantes são fornecidas:Fim da mudança
    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

Início da mudançaPara utilizar o novo domínio e analisador XMLNSC, você deve recodificar seu ESQL para utilizar XMLNSC em seus caminhos. Considere as seguintes instruções ESQL:
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;
Fim da mudança
Início da mudançaEm cada caso, o fluxo de bits XML esperado na fila de entrada e gravado na fila de saída tem o formato:
    <Pessoa><Salário>42</Salário></Pessoa>
Fim da mudança

Início da mudançaOs três exemplos ESQL são diferentes, pois eles utilizam diferentes analisadores para possuírem esses elementos. O analisador de propriedade pode ser configurado pela mensagem de entrada, com um cabeçalho MQRFH2 com uma pasta <mcd>, especificando o domínio do conjunto de mensagens, ou pelo domínio do conjunto de mensagens definido nas propriedades Padrão do nó de entrada do fluxo. Se ambas definições de domínio estiverem presentes, o valor para o domínio do conjunto de mensagens no cabeçalho MQRFH2 pasta <mcd> tem prioridade.Fim da mudança

Início da mudançaSe quiser migrar para o domínio XMLNSC, ao utilizar os cabeçalhos MQRFH2, o novo nome do domínio é requerido no campo <Msd> da pasta <mcd>. Observe que o novo nome do domínio aparece no cabeçalho MQRFH2 da mensagem de saída. Para proteger os aplicativos externos contra essas 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 ou Mapping. Com essas propriedades configuradas, as mensagens de entrada e saída não são alteradas, permitindo que o valor do campo <Msd> permaneça como XMLNS. O fluxo agora utiliza o analisador compacto e os caminho ESQL são codificados utilizando XMLNSC.Fim da mudança

Início da mudançaSe as mensagens de entrada não contiverem cabeçalhos MQRFH2 e a propriedade do domínio de mensagem do nó de entrada for utilizada para especificar o domínio, é possível migrar para o domínio XMLNSC, configurando a propriedade do domínio do nó de entrada do fluxo diretamente para XMLNSC, ou deixe-o como XMLNS e configure a propriedade Utilizar o Analisador Compacto XMLNSC para o Domínio XMLNS. O analisador Compacto é utilizado no fluxo e os caminhos ESQL devem ser codificados utilizando XMLNSC com uma dessas configurações.Fim da mudança

Início da mudançaSe as mensagens de saída 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.Fim da mudança

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';
Início da mudançaDe maneira semelhante, no domínio XMLNSC, o tipo de codificação XML e o modo independente XML também são processados simplesmente como atributos da declaração XML e podem ser configurados em ESQL da seguinte forma:
SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)Encoding = 'UTF-8';
SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)StandAlone = 'Yes';
Fim da mudança

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. Essa situação ocorre somente se você estiver utilizando ambos analisadores no mesmo fluxo - um para entrada e um para saída; nessa situação, utilize o analisador compacto para ambos 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 por mensagens XML em Manipulando Mensagens no Domínio XML, em conjunto com as informações do 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. 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';

Início da mudançaComo Utilizar EntityDefintion e EntityReference com o Analisador XMLNSCFim da mudança

Início da mudançaDois exemplos são fornecidos para demonstrar como utilizar EntityDefintion e EntityReference com o analisador XMLNSC utilizando ESQL. Ambos exemplos utilizam a mesma mensagem de entrada:
<BookInfo dtn="BookInfo" edn="author" edv="A.N.Other">
<Identifier>ES39B103T6</Identifier>
</BookInfo>
Fim da mudança
Início da mudançaO primeiro exemplo mostra uma maneira para utilizar EntityDefintion e EntityReference com o analisador XMLNSC. Essa é a mensagem de saída gerada pelo exemplo:
<!DOCTYPE BookInfo [<!ENTITY author "A.N.Other">]>
<BookInfo><Identifier>ES39B103T7</Identifier><entref>&author;</entref></BookInfo>
Fim da mudança
Início da mudançaNo ESQL a seguir, XMLNSC.EntityDefinition é utilizado para definir o autor da entidade com código permanente com um valor igual a A.N.Other derivado do edv da mensagem de entrada. XMLNSC.EntityReference é utilizado para criar uma referência para o autor da entidade no corpo da mensagem XML.
SET OutputRoot.MQMD = InputRoot.MQMD;
DECLARE cursor REFERENCE TO InputRoot.XMLNSC.BookInfo;
SET OutputRoot.XMLNSC.BookInfo.Identifier = cursor.Identifier;
SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)* NAME = cursor.dtn;
SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)*.(XMLNSC.EntityDefinition)* NAME = 'author';
SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)*.(XMLNSC.EntityDefinition)author VALUE = cursor.edv;
SET OutputRoot.XMLNSC.(XMLNSC.BookInfo).entref.(XMLNSC.EntityReference)* = 'author';
Fim da mudança

Início da mudançaA variável cursor é utilizada para apontar para as seguintes variáveis: dtn, o nome do tipo de documento; edv, o valor da definição da entidade e o valor para Identifier. Os valores para essas variáveis são derivados da mensagem de entrada. Fim da mudança

Início da mudançaEsse segundo exemplo demonstra como criar uma mensagem de saída que contém uma definição de entidade e uma referência para essa entidade com base no conteúdo da mesma mensagem de entrada. Essa é a mensagem de saída gerada pelo exemplo que mostra a definição da entidade chamada author e uma referência para a entidade no corpo da mensagem XML:
<!DOCTYPE BookInfo [<!ENTITY author "Book 1">]>
<BookInfo Identifier="ES39B103T6">&author;</BookInfo>
Fim da mudança
Início da mudançaO ESQL a seguir utiliza EntityDefintion e EntityReference com o analisador XMLNSC para gerar a mensagem de saída anterior:
SET OutputRoot.MQMD = InputRoot.MQMD;
DECLARE cursor REFERENCE TO InputRoot.XMLNSC.BookInfo;
CREATE FIELD OutputRoot.XMLNSC.BookInfo;
SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)* NAME = cursor.dtn;
SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)*.(XMLNSC.EntityDefinition)* NAME = cursor.edn;
SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)*.(XMLNSC.EntityDefinition)* VALUE = 'Book 1';
SET OutputRoot.XMLNSC.(XMLNSC.Folder)*[<].(XMLNSC.EntityReference)* = cursor.edn;
SET OutputRoot.XMLNSC.Identifier.(XMLNSC.DoubleAttribute)Identifier = cursor.Identifier;
Fim da mudança

Início da mudançaXMLNSC.EntityDefinition é utilizado para definir a entidade author com um valor igual a Book 1. Uma referência a entidade autor é criada, então, na mensagem utilizando XMLNSC.EntityReference. A variável cursor é utilizada para apontar para as variáveis: dtn, o nome do tipo de documento; edn, o nome da definição da entidade e o valor para Identifier. Essas variáveis são todas derivadas da mensagem de entrada. O código XMLNSC.DoubleAttribute é utilizado para incluir aspas no Identifier. Para incluir somente aspas simples no Identifier, então, XMLNSC.SingleAttribute pode ser utilizado.Fim da mudança

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, 2006 Última Atualização: 1 Sep 2006
ac26040_