El dominio XMLNSC es una extensión del dominio XMLNS que, a su vez, era una extensión del dominio XML original.
Con el dominio XMLNS, la intención era añadir soporte de espacio de nombres y, por razones de compatibilidad, se creó un dominio nuevo para que las aplicaciones existentes no se vieran afectadas. Con el nuevo dominio XMLNSC, la intención es crear un árbol más compacto y, por consiguiente, utilizar menos memoria al manejar mensajes grandes. De nuevo, por razones de compatibilidad, se ha añadido un dominio nuevo para que las aplicaciones existentes no se vean afectadas.
Estructura del árbol de mensaje
<Folder1> <Folder2 Attribute1='AttributeValue1'> <Field1><Value1></Field1> <Field2 Attribute2='AttributeValue2'><Value2></Field2> </Folder2> </Folder1>
En el dominio XMLNSC, 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 caso, el analizador XMLNSC representa el mensaje mediante dos elementos de nombre y 100 de nombre-valor, mientras que los analizadores XML y XMLNS utilizarán 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.
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 SQL anterior parece casi idéntico al que se utilizaría con el analizador XML, fíjese especialmente en que las constantes de tipo que se utilizan son las que pertenecen al analizador XMLNSC. La utilización 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 diferentes.
Manejo de texto mixto
Por omisión, el texto mixto simplemente se descarta basándose en que, si existe, es simplemente formato y no tiene ningún significado.
Sin embargo, se proporciona una modalidad en la que, al realizar el análisis, cualquier texto que aparezca en un lugar que no sea entre un código inicial y un código final (es decir, open->open, close->close y close->open) se representa mediante un solo elemento Value. Los tipos de elemento de valor soportan PCDATA, CDATA y un híbrido 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
Por omisión, los comentarios también se descartan simplemente basándose en que, si existen, sólo son información auxiliar sin significado.
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
Por omisión, las instrucciones de proceso también se descartan simplemente basándose en que, si existen, son simplemente información auxiliar sin significado.
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
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 casos difieren en que utilizan analizadores diferentes para ser propietarios de estos elementos. Por consiguiente, se espera un nombre de dominio diferente en la cabecera MQRFH2 del mensaje de entrada y se graba un nombre de dominio diferente en la cabecera MQRFH2 del mensaje de salida.
Para proteger las aplicaciones externas frente a estos cambios, se puede especificar la propiedad Utilizar analizador compacto XMLNSC para dominio XMLNS en el nodo de entrada del flujo y en el nodo de cálculo que contiene estas sentencias.
El primer ejemplo hace que se utilice el analizador XMLNSC para analizar el cuerpo del mensaje cuando la cabecera MQRFH2 del mensaje de entrada especifica el dominio XMLNS; eso en el nodo de cálculo hace que la cabecera MQRFH2 de salida especifique el analizador XMLNS en lugar de XMLNSC, permitiendo así que los mensajes de entrada y salida no se modifiquen.
Si los mensajes de entrada no contienen cabeceras MQRFH2 y se está utilizando el atributo de dominio de mensaje del nodo de entrada para especificar el dominio, puede establecerlo en XMLNSC o establecerlo en XMLNS y establecer también la propiedad Utilizar analizador compacto XMLNSC para dominio XMLNS.
Si los mensajes de salida no contienen cabeceras MQRFH2, el dominio no aparece en ningún lugar en los mensajes de salida y el establecimiento de la propiedad Utilizar analizador compacto XMLNSC para dominio XMLNS del nodo de cálculo 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';
Tenga en cuenta que aunque se está utilizando el analizador XMLNS, las constantes de tipo de elemento son las que pertenecen al analizador XML. Esto 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';
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 se están utilizando ambos analizadores en el mismo flujo - uno para la entrada y otro para la salida; por consiguiente, se recomienda utilizar 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 Manipulación de mensajes del dominio XML, junto con la información del tema Manipulación del contenido del texto 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 | 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 | XMLNSC.Field | 0x03000000 |
PCData | XMLNSC.PCDataField | 0x03000000 |
CData | XMLNSC.CDataField | 0x03000001 |
Híbrido | XMLNSC.HybridField | 0x03000002 |
Atributo | 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 | 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';
Modalidades de analizador XMLNSC
Por omisión, el analizador XMLNSC descarta los elementos de documento que normalmente no tienen significado de negocio. Sin embargo, las modalidades de analizador están disponibles 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 mientras se analiza:
DECLARE X BLOB ASBITSTREAM(InputRoot.XMLNSC.Data OPTIONS XMLNSC.ProcessingInstructionsRetainAll); ... CREATE LASTCHILD OF outputRoot PARSE(X OPTIONS XMLNSC.ProcessingInstructionsRetainNone);