El dominio XMLNSC es una extensión del dominio XMLNS que, a su vez, es una extensión del dominio XML.
El dominio XMLNS añade soporte de espacio de nombres. El dominio XMLNSC crea un árbol más compacto y, por lo tanto, utiliza menos memoria al manejar mensajes grandes. Las aplicaciones existentes pueden seguir utilizando el dominio XMLNS, pero puede aprovechar el aumento de rendimiento y memoria con el dominio XMLNSC para nuevas aplicaciones.
Estructura del árbol de mensaje
<Folder1> <Folder2 Attribute1='AttributeValue1'> <Field1>Value1</Field1> <Field2 Attribute2='AttributeValue2'>Value2</Field2> </Folder2> </Folder1>
En el dominio XMLNSC, el texto codificado se representa mediante dos elementos de nombre (Folder1 y Folder2) y cuatro elementos de nombre-valor, que son Attribute1, Field1, Field2 y Attribute2.
<Folder1> <Folder2> <Field1>Value1</Field1> <Field2>Value2</Field2> .... <Field100>Value100</Field100> </Folder2> </Folder1>
En este ejemplo, el analizador XMLNSC representa el mensaje mediante dos elementos de nombre y 100 de nombre-valor, mientras que los analizadores XML y XMLNS utilizan 102 elementos de nombre y 100 elementos de valor, más 103 elementos de valor adicionales para representar el espacio en blanco implícito en los mensajes formateados.
Los dominios XML y XMLNS crean elementos de nombre-valor para los caracteres de formato de espacio en blanco entre la apertura y cierre de cada carpeta o campo. Estos elementos de espacio en blanco tienen un nombre vacío y un valor para el espacio, tabulador, salto de línea u otros caracteres utilizados en el formato del documento XML. Estos elementos no tienen un valor útil y, por lo tanto, pueden descartarse para mejorar la compresión. Por la misma razón, el comportamiento predeterminado es descartar todas las instrucciones de proceso y comentarios XML en la corriente de entrada y no crear ningún elemento en el árbol de dominio compacto.
Atributos y texto codificado
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';
Aunque el ESQL anterior parece casi idéntico al utilizado con el analizador XML, las constantes de tipo pertenecen al analizador XMLNSC. El uso de constantes que pertenecen a otros analizadores (por ejemplo, XML) produce resultados inesperados porque las constantes con nombres similares (por ejemplo, XML.Attribute) tienen valores distintos.
XMLNSC.Attribute XMLNSC.SingleAttribute XMLNSC.DoubleAttribute
<Folder1 Item='ValueA'> <Item>Value1</Item> </Folder1>
SET ItemAttributeValueHolder = InputRoot.XMLNSC.Folder1.(XMLNSC.Attribute)Item; SET ItemFieldValueHolder = InputRoot.XMLNSC.Folder1.(XMLNSC.Field)Item;
Este método representa una ventaja frente al uso de una selección de índice de matriz con Folder1 ya que no importa si el atributo está presente o no en la corriente de entrada.
Manejo de texto mixto
Por omisión, el texto mixto se descarta porque normalmente es espacio en blanco de formato y no tiene ningún significado. No obstante, se proporciona una modalidad en la que, al realizar el análisis, cualquier texto que aparece en un lugar que no sea entre un código de apertura y un código de cierre (es decir, open->open, close->close y close->open) se representa mediante un solo elemento Value sin nombre. Los tipos de elemento de valor soportan PCDATA, CDATA e hybrid, que es una mezcla de los dos 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);
Manejo de comentarios
XMLNSC.Comment
XMLNSC.CommentsRetainNone = 0x0000000000000000 XMLNSC.CommentsRetainAll = 0x0002000000000000Por ejemplo:
DECLARE X BLOB ASBITSTREAM(InputRoot.XMLNSC.Data OPTIONS XMLNSC.CommentsRetainAll); ... CREATE LASTCHILD OF OutputRoot PARSE(X OPTIONS XMLNSC.CommentsRetainNone);
Manejo de instrucciones de proceso
XMLNSC.ProcessingInstruction
XMLNSC.ProcessingInstructionsRetainNone = 0x0000000000000000 XMLNSC.ProcessingInstructionsRetainAll = 0x0004000000000000Por ejemplo:
DECLARE X BLOB ASBITSTREAM(InputRoot.XMLNSC.Data OPTIONS XMLNSC.ProcessingInstructionsRetainAll); ... CREATE LASTCHILD OF OutputRoot PARSE(X OPTIONS XMLNSC.ProcessingInstructionsRetainNone);
Migración de un flujo existente al dominio 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;
<Person><Salary>42</Salary></Person>
Los tres ejemplos ESQL son diferentes porque utilizan analizadores diferentes como propietarios de estos elementos. El analizador propietario lo puede establecer el mensaje de entrada, con una cabecera MQRFH2 con una carpeta <mcd> que especifica el dominio del conjunto de mensajes, o el dominio del conjunto de mensajes definido en las propiedades de análisis de mensajes de entrada del nodo de entrada del flujo. Si estas dos definiciones de dominio están presentes, tiene preferencia el valor para el dominio del conjunto de mensajes en la carpeta <mcd> de la cabecera MQRFH2.
Para migrar al dominio XMLNSC, cuando se utilizan cabeceras MQRFH2, añada el nuevo nombre de dominio al campo <Msd> de la carpeta <mcd>. El nuevo nombre de dominio aparece en la cabecera MQRFH2 del mensaje de salida. Para proteger las aplicaciones externas de estos cambios, especifique la propiedad Utilizar analizador compacto XMLNSC para dominio XMLNS en el nodo de entrada del flujo y en el nodo Compute o Mapping. Con estas propiedades establecidas, los mensajes de entrada y salida no cambian, lo que permite que el valor del campo <Msd> siga siendo XMLNS. El flujo utiliza ahora el analizador compacto y las vías de acceso ESQL se codifican utilizando XMLNSC.
Si los mensajes de entrada no contienen cabeceras MQRFH2 y la propiedad de dominio de mensajes del nodo de entrada se utiliza para especificar el dominio, puede migrar al dominio XMLNSC estableciendo la propiedad de dominio del nodo de entrada del flujo directamente en XMLNSC. De forma alternativa, puede dejarlo como XMLNS y establecer la propiedad Utilizar analizador compacto XMLNSC para dominio XMLNS. El analizador compacto se utiliza en el flujo y debe codificar las vías de acceso ESQL utilizando XMLNSC con cualquiera de estos valores.
Si los mensajes de salida no contienen cabeceras MQRFH2, el dominio no aparece en ninguna parte en los mensajes de salida y el establecimiento de la propiedad Utilizar analizador compacto XMLNSC para dominio XMLNS del nodo Compute no tiene ningún efecto.
Creación de cabeceras XML
SET OutputRoot.XML.(XML.XmlDecl)*.(XML.Version)* = '1.0';
SET OutputRoot.XMLNS.(XML.XmlDecl)*.(XML.Version)* = '1.0';
Aunque se utiliza el analizador XMLNS, las constantes de tipo de elemento son las que pertenecen al analizador XML. Este código funciona porque los valores de tipo utilizados por los analizadores XML y XMLNS son los mismos. Sin embargo, para el analizador XMLNSC, los valores de tipo son diferentes y, por consiguiente, deberá utilizar siempre las constantes de tipo propias.
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';
//Crear el nodo raíz de dominio XML MBElement xmlRoot = root.createElementAsLastChild(MbXMLNSC.PARSER_NAME); //Crear el nodo padre de declaración 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"); //Crear el cuerpo del mensaje
<?xml version="1.0" encoding="utf_8"?>
Copia de árboles de mensajes
Al copiar árboles, el intermediario considera XML y XMLNSC como analizadores diferentes, lo que significa que todos los atributos del árbol de origen se correlacionan con los elementos del árbol de destino. Esta situación sólo se produce si está utilizando ambos analizadores en el mismo flujo; uno para la entrada y otro para la salida; en esta situación, utilice el analizador compacto para ambos flujos.
Si se deben utilizar analizadores diferentes para el flujo de entrada y el flujo de salida, es posible que necesite especificar de forma explícita los tipos de elementos en las vías de acceso o utilizar la Función FIELDVALUE para asegurar una copia de valores escalares en lugar de subárboles.
Siga la información de guía proporcionada para los mensajes XML del apartado Manipular mensajes en el dominio XML, junto con la información del tema Manipular el contenido del cuerpo del mensaje.
Acceso a elementos de sintaxis en el dominio XMLNSC utilizando nombres de correlación
Elemento de sintaxis | Nombre de correlación | Valor constante |
---|---|---|
Carpeta | XMLNSC.Folder | 0x01000000 |
Tipo de documento 1 | XMLNSC.DocumentType | 0x01000300 |
Declaración XML 2 | XMLNSC.XmlDeclaration | 0x01000400 |
Valor de campo o atributo 3 | XMLNSC.Value | 0x02000000 |
Valor de PCData | XMLNSC.PCDataValue | 0x02000000 |
Valor de CData | XMLNSC.CDataValue | 0x02000001 |
Valor híbrido | XMLNSC.HybridValue | 0x02000002 |
Referencia de entidad | 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 |
Comillas simples | XMLNSC.SingleAttribute | 0x03000101 |
Comillas dobles | XMLNSC.DoubleAttribute | 0x03000100 |
Declaración de espacio de nombres | XMLNSC.NamespaceDecl | 0x03000102 |
Comillas simples | XMLNSC.SingleNamespaceDecl | 0x03000103 |
Comillas dobles | XMLNSC.DoubleNamespaceDecl | 0x03000102 |
Datos de corriente de bits | XMLNSC.BitStream | 0x03000200 |
Definición de entidad 1 3 | XMLNSC.EntityDefinition | 0x03000300 |
Comillas simples | XMLNSC.SingleEntityDefinition | 0x03000301 |
Comillas dobles | XMLNSC.DoubleEntityDefinition | 0x03000300 |
Comentario | XMLNSC.Comment | 0x03000400 |
Instrucción de proceso | XMLNSC.ProcessingInstruction | 0x03000401 |
SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)BodyDocument .(XMLNSC.EntityDefinition)TestDef = 'Compact Tree Parser XML Test Module Version 1.0';
-- Crear la declaración XML SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.Version = 1.0; SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.Encoding = 'UTF8'; SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.Standalone = 'yes';
Utilización de EntityDefinition y EntityReference con el analizador 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';
Este segundo ejemplo muestra cómo crear un mensaje de salida que contenga una definición de entidad y una referencia a esa entidad, basándose en el contenido del mismo mensaje 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;
Modalidades de analizador XMLNSC
Por omisión, el analizador XMLNSC descarta los elementos de documento que normalmente no tienen ningún significado. No obstante, hay disponibles modalidades de analizador para forzar la retención de estos elementos. Puede configurar estas modalidades en las propiedades del nodo que especifica que el mensaje se debe analizar en el dominio XMLNSC.
XMLNSC.MixedContentRetainNone XMLNSC.MixedContentRetainAll XMLNSC.CommentsRetainNone XMLNSC.CommentsRetainAll XMLNSC.ProcessingInstructionsRetainNone XMLNSC.ProcessingInstructionsRetainAllEl ejemplo siguiente utiliza las modalidades XMLNSC.ProcessingInstructionsRetainAll y XMLNSC.ProcessingInstructionsRetainNone para retener instrucciones de proceso de documentos durante el análisis:
DECLARE X BLOB ASBITSTREAM(InputRoot.XMLNSC.Data OPTIONS XMLNSC .ProcessingInstructionsRetainAll); ... CREATE LASTCHILD OF outputRoot PARSE(X OPTIONS XMLNSC .ProcessingInstructionsRetainNone);