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
<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.
<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.
Os 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.
Atributos e Texto com Tag
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.
XMLNSC.SingleAttribute XMLNSC.DoubleAttribute
XMLNSC.Attribute
<Folder1 Item='ValueA'> <Item>Value1</Item> </Folder1>
SET ItemAttributeValueHolder = InputRoot.XMLNSC.Folder1.(XMLNSC.Attribute)Item; SET ItemFieldValueHolder = InputRoot.XMLNSC.Folder1.(XMLNSC.Field)Item;
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
Por 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.
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) é representado por um único elemento Value não denominado.
Os tipos de elementos de valor suportam PCDATA, CDATA
e híbrido, que é uma mistura dos dois precedentes.
XMLNSC.Value XMLNSC.PCDataValue XMLNSC.CDataValue XMLNSC.HybridValue
XMLNSC.MixedContentRetainNone = 0x0000000000000000 XMLNSC.MixedContentRetainAll = 0x0001000000000000
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.
XMLNSC.Comment
XMLNSC.CommentsRetainNone = 0x0000000000000000 XMLNSC.CommentsRetainAll = 0x0002000000000000Por 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.
XMLNSC.ProcessingInstruction
XMLNSC.ProcessingInstructionsRetainNone = 0x0000000000000000 XMLNSC.ProcessingInstructionsRetainAll = 0x0004000000000000Por exemplo:
DECLARE X BLOB ASBITSTREAM(InputRoot.XMLNSC.Data OPTIONS XMLNSC.ProcessingInstructionsRetainAll); ... CREATE LASTCHILD OF outputRoot PARSE(X OPTIONS XMLNSC.ProcessingInstructionsRetainNone);
Migrando um Fluxo Existente
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;
<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 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.
Se 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.
Se 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.
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 o Domínio XMLNS do nó Compute
não terá efeito.
Construindo Cabeçalhos XML
SET OutputRoot.XML.(XML.XmlDecl)*.(XML.Version)* = '1.0';
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.
SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)Version = '1.0';
SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)Encoding = 'UTF-8'; SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)StandAlone = 'Yes';
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
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 |
SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)BodyDocument .(XMLNSC.EntityDefinition)TestDef = 'Compact Tree Parser XML Test Module Version 1.0';
-- 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';
Como Utilizar EntityDefintion e EntityReference com o Analisador
XMLNSC
<BookInfo dtn="BookInfo" edn="author" edv="A.N.Other"> <Identifier>ES39B103T6</Identifier> </BookInfo>
<!DOCTYPE BookInfo [<!ENTITY author "A.N.Other">]> <BookInfo><Identifier>ES39B103T7</Identifier><entref>&author;</entref></BookInfo>
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:
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.
<!DOCTYPE BookInfo [<!ENTITY author "Book 1">]> <BookInfo Identifier="ES39B103T6">&author;</BookInfo>
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 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.
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.
XMLNSC.MixedContentRetainNone XMLNSC.MixedContentRetainAll XMLNSC.CommentsRetainNone XMLNSC.CommentsRetainAll XMLNSC.ProcessingInstructionsRetainNone XMLNSC.ProcessingInstructionsRetainAllO 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);