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
<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.
<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
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.
XMLNSC.AttributeXMLNSC.SingleAttributeXMLNSC.DoubleAttribute
<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 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.
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
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
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 para o Domínio XMLNSC
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 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
SET OutputRoot.XML.(XML.XmlDecl)*.(XML.Version)* = '1.0';
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.
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';
//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
<?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
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 |
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';
Utilizando EntityDefinition 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';
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.
<!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;
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.
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);