Manipulando Mensagens no Domínio XMLNSC

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

O domínio XMLNS inclui suporte a espaço de nomes. O domínio XMLNSC constrói uma árvore mais compacta, portanto, utiliza menos memória ao manipular mensagens grandes. Seus aplicativos existentes podem continuar a utilizar o domínio XMLNS, mas você pode aproveitar a vantagem dos ganhos de desempenho e memória com o domínio XMLNSC para novos aplicativos.

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, o texto com tag é representado por dois elementos de nome (Folder1 e Folder2) e quatro elementos nome-valor, que são Attribute1, Field1, Field2 e Attribute2.

Os domínios XML e XMLNS diferem em que os dois campos (Field1 e Field2) são representados cada um por um elemento de nome com um elemento de valor-filho. Essa diferença poderá parecer pequena, mas as mensagens muitas vezes têm muitos desses campos folha. Por exemplo:
    <Folder1>
        <Folder2>
            <Field1>Value1</Field1>
            <Field2>Value2</Field2>
            ....
            <Field100>Value100</Field100>
        </Folder2>
    </Folder1>

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

Os domínios XML e XMLNS criam elementos nome-valor para os caracteres de formatação de espaço em branco entre a abertura e o fechamento de cada pasta ou campo. Esses elementos de espaço em branco têm um nome vazio e um valor para 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 todas as instruções e comentários de processamento XML no fluxo de entrada e não criar nenhum elemento na árvore de domínio compacto.

Atributos e Texto com Tag

Os atributos e texto com tag são representados por elementos nome-valor, portanto, 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 mostrada anteriormente pode ser produzida pelas seguintes instruções ESQL:
    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 ESQL anterior pareça quase idêntico ao utilizado com o analisador XML, as constantes de tipo pertencem ao analisador XMLNSC. O uso de constantes que pertencem a outros analisadores (por exemplo, XML) leva a resultados inesperados, porque constantes nomeadas de forma semelhante (por exemplo, XML.Attribute) têm valores diferentes.

As constantes a seguir são definidas no domínio XMLNSC para criar atributos:
XMLNSC.AttributeXMLNSC.SingleAttributeXMLNSC.DoubleAttribute
Considere a seguinte mensagem de entrada XML:
    <Folder1 Item='ValueA'>
        <Item>Value1</Item>
    </Folder1>
Para remover a ambigüidade do nome Item, que é utilizado como um nome de atributo e como um nome de campo em Folder1, será possível utilizar a seguinte ESQL:
    SET ItemAttributeValueHolder = InputRoot.XMLNSC.Folder1.(XMLNSC.Attribute)Item;
    SET ItemFieldValueHolder = InputRoot.XMLNSC.Folder1.(XMLNSC.Field)Item;

Esse método tem uma vantagem sobre o uso de uma seleção de índice de matriz com Folder1, já que não importa se o atributo está presente no fluxo de entrada.

Manipulando o Texto Misto

Por padrão, o texto misto é descartado porque em geral está apenas formatando o espaço em branco e não tem significado comercial. Entretanto, é fornecido um modo no qual, durante a análise, todo texto que ocorrer que não seja 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 (Value) não nomeado. Os tipos de elemento de valor suportam PCDATA, CDATA e hybrid, que é uma mistura dos dois anteriores.

Não existe comportamento especial de elemento de sintaxe para obtenção e configuração de valores. É possível acessar elementos de valor a partir da ESQL apenas abordando-os explicitamente. São fornecidas as seguintes constantes extras para esta finalidade:
   XMLNSC.Value
   XMLNSC.PCDataValue    XMLNSC.CDataValue
   XMLNSC.HybridValue
O modo é controlado pela propriedade Reter Conteúdo Combinado na guia Opções do Analisador na visualização Propriedades em todos os nós de análise de mensagem; por exemplo, o nó MQInput. Para controle de programação utilizando opções de mensagem, as seguintes constantes são fornecidas:
   XMLNSC.MixedContentRetainNone = 0x0000000000000000
   XMLNSC.MixedContentRetainAll  = 0x0001000000000000
Você pode utilizar estas constantes nas cláusulas Option da ESQL 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 são descartados, porque são informações auxiliares sem significado comercial. 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. É fornecida a seguinte constante extra para esta finalidade:
   XMLNSC.Comment
O modo é controlado configurando a propriedade Reter Comentários na guia Opções do Analisador na visualização Propriedades em todos os nós de análise de mensagem; por exemplo, o nó MQInput. Para controle de programação utilizando opções de mensagem, as seguintes constantes são fornecidas:
   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 são descartadas, visto serem informações auxiliares, sem significado comercial. 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 pela propriedade Reter Instruções de Processamento na guia Opções do Analisador da visualização Propriedades em todos os nós de análise de mensagem; por exemplo, o nó MQInput. Para controle de programação utilizando opções de mensagem, as seguintes constantes são fornecidas:
    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 para o Domínio XMLNSC

Para utilizar o domínio XMLNSC e o analisador, recodifique o 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;
Em cada caso, o fluxo de bits XML esperado na fila de entrada e gravado na fila de saída tem o seguinte formato:
    <Pessoa><Salário>42</Salário></Pessoa>

Os três exemplos ESQL são diferentes, pois eles utilizam diferentes analisadores para possuírem esses elementos. O analisador de propriedade pode ser definido pela mensagem que chega, com um cabeçalho MQRFH2, e uma pasta <mcd> que especifica o domínio do conjunto de mensagens, ou pelo domínio do conjunto de mensagens definido nas propriedades de Análise de Mensagem de Entrada (Input Message Parsing) do nó de entrada de fluxo. Se essas definições de domínio estiverem presentes, o valor para o domínio do conjunto de mensagens na pasta <mcd> do cabeçalho MQRFH2 terá precedência.

Para migrar para o domínio XMLNSC, quando utilizar cabeçalhos MQRFH2, inclua o novo nome de domínio no campo <Msd> da pasta <mcd>. O novo nome de domínio aparece no cabeçalho MQRFH2 da mensagem de saída. Para proteger aplicativos externos contra estas alterações, especifique a propriedade Utilizar Analisador Compacto XMLNSC para Domínio XMLNS no nó de entrada do fluxo e no nó Compute ou Mapeamento. Com essas propriedades definidas, as mensagens de entrada e saída ficam inalteradas, permitindo que o valor do campo <Msd> permaneça como XMLNS. O fluxo agora utiliza o analisador compacto e os caminhos ESQL são codificados utilizando XMLNSC.

Se as mensagens que chegam 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, será possível migrar para o domínio XMLNSC, definindo a propriedade do domínio do nó de entrada do fluxo diretamente como XMLNSC. Como alternativa, você pode deixá-la como XMLNS e definir a propriedade Utilizar Analisador Compacto XMLNSC para o Domínio XMLNS. O analisador compacto é utilizado no fluxo e você deve codificar os caminhos ESQL utilizando XMLNSC com qualquer uma dessas configurações.

Se 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 Domínio XMLNS do nó Compute não tem 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, altere a raiz:
SET OutputRoot.XMLNS.(XML.XmlDecl)*.(XML.Version)* = '1.0';

Embora o analisador XMLNS seja utilizado, as constantes de tipo de elemento são aquelas que pertencem ao analisador XML. Esse código funciona porque os valores de tipo que são utilizados pelos analisadores XML e XMLNS são os mesmos. Entretanto, para o analisador, os valores de tipo são diferentes e, por isso, você deve utilizar sempre suas próprias constantes de tipo.

No domínio XMLNSC, não existe tipo especial para a versão XML; ela é tratada como atributo da declaração XML. A sintaxe equivalente para o exemplo anterior é:
SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)Version = '1.0';
De maneira semelhante, no domínio XMLNSC, o tipo de codificação XML e o modo independente XML também são processados como atributos da declaração XML e podem ser definidos utilizando o seguinte ESQL:
SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)Encoding = 'UTF-8';
SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)StandAlone = 'Yes';
Para fornecer a mesma saída de um nó JavaCompute, utilize o seguinte código de exemplo:
//Crie o nó raiz do domínio XML
MBElement xmlRoot = root.createElementAsLastChild(MbXMLNSC.PARSER_NAME);

//Crie o nó-pai da declaração XML
MbElement xmlDecl = xmlRoot.createElementAsFirstChild(MbXMLNSC.XML_DECLARATION);

xmlDecl.setName("XmlDeclaration");

MbElement version = xmlDecl.CreateElementAsFirstChild(MbXMLNSC.ATTRIBUTE, "Version", "1.0");
MbElement encoding = xmlDecl.CreateElementAsFirstChild(MbXMLNSC.ATTRIBUTE, "Encoding", "utf-8");

//Crie o corpo da mensagem
Esse código resulta na seguinte linha sendo exibida na mensagem de saída:
<?xml version="1.0" encoding="utf_8"?>

Copiando Árvores de Mensagens

Ao copiar árvores, o intermediário considera XML e XMLNSC 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; nesta situação, utilize o analisador compacto para os dois fluxos.

Se for necessário utilizar diferentes analisadores para fluxo de entrada e fluxo de saída, você poderá precisar 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. Quando você trabalhar no domínio XMLNSC, utilize esses nomes para consultar os elementos nas mensagens de entrada e para definir elementos, atributos e valores nas mensagens de saída.
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 3 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 3 XMLNSC.Field 0x03000000
PCData XMLNSC.PCDataField 0x03000000
CData XMLNSC.CDataField 0x03000001
Híbrido XMLNSC.HybridField 0x03000002
     
Atributo 3 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 do Fluxo de Bits XMLNSC.BitStream 0x03000200
     
Definição de entidade 1 3 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 (Document Type) é utilizado somente para definições de entidade; por 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 elementos filho para a versão e assim por diante; por 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';
  3. Estes valores de correlação representam vários possíveis tipos de entidade e não devem ser utilizados para verificações específicas em uma instrução FIELDTYPE(...). Por exemplo, IF FIELDTYPE(...) = XMLNSC.Attribute THEN ... nunca corresponderia a nada, porque o elemento seria um XMLNSC.SingleAttribute ou um XMLNSC.DoubleAttribute.

Utilizando EntityDefinition e EntityReference com o Analisador XMLNSC

Dois exemplos são fornecidos para demonstrar como utilizar EntityDefinition e EntityReference com o analisador XMLNSC utilizando ESQL. Ambos os exemplos utilizam a mesma mensagem de entrada:
<BookInfo dtn="BookInfo" edn="author" edv="A.N.Other">
<Identifier>ES39B103T6</Identifier>
</BookInfo>
O primeiro exemplo mostra como utilizar EntityDefinition e EntityReference com o analisador XMLNSC. A seguinte mensagem de saída é gerada pelo exemplo:
<!DOCTYPE BookInfo [<!ENTITY author "A.N.Other">]>
<BookInfo><Identifier>ES39B103T7</Identifier><entref>&author;</entref></BookInfo>
No seguinte ESQL, XMLNSC.EntityDefinition é utilizado para definir o autor da entidade codificada permanentemente com um valor de A.N.Other, que é derivado de 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';
A variável cursor é utilizada para apontar para as seguintes variáveis:
  • O nome do tipo de documento dtn
  • O valor da definição de entidade edv
  • O valor para Identificador (Identifier)
Os valores para essas variáveis são derivados da mensagem de entrada.

Esse segundo exemplo demonstra como criar uma mensagem de saída que contém uma definição de entidade e uma referência a essa entidade, com base no conteúdo da mesma mensagem de entrada.

A seguinte mensagem de saída é gerada pelo exemplo, mostrando uma definição de entidade denominada author e uma referência à entidade no corpo da mensagem XML:
<!DOCTYPE BookInfo [<!ENTITY author "Book 1">]>
<BookInfo Identifier="ES39B103T6">&author;</BookInfo>
A seguinte ESQL 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;
XMLNSC.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 seguintes variáveis:
  • O nome do tipo de documento dtn
  • O valor da definição de entidade edv
  • O valor para Identificador (Identifier)
Essas variáveis são todas derivadas da mensagem de entrada. O código XMLNSC.DoubleAttribute é utilizado para incluir aspas duplas no Identificador (Identifier), e o código XMLNSC.SingleAttribute, para incluir aspas simples no Identificador (Identifier).

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. Você pode configurar esses modos nas propriedades do nó que especifica que a mensagem 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

Copyright IBM Corporation 1999, 2009Copyright IBM Corporation 1999, 2009.
Última atualização : 2009-02-13 16:11:55

ac26040_