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 questões de compatibilidade, um novo domínio foi criado de forma que 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
<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.
<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
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 do SQL acima parecer praticamente idêntico àquele que seria utilizado com o analisador XML, observe, principalmente, que as constantes de tipo utilizadas são as pertencentes ao analisador 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.
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 no qual, ao analisar qualquer texto ocorrido que não esteja entre uma tag de abertura e uma tag de fechamento (ou seja, open->open, close->close e close->open) seja representado por um único elemento Valor. 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 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ó input 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ó input 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
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';
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 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 |
Campo ou Valor do 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';
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);