El dominio XMLNSC es una extensión del dominio XMLNS que, a su vez, es una extensión del dominio XML original.
El dominio XMLNS añade soporte de espacio de nombres. El nuevo dominio XMLNSC construye un árbol más compacto y, por consiguiente, utiliza menos memoria al manejar mensajes grandes. Se ha añadido un nuevo dominio 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, esto 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ían 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, fíjese especialmente en que 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 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;
Este método representa una ventaja frente al uso de una selección de índice de matriz con Folder1 ya que no se ve afectado si el atributo no está presente en la corriente de entrada.
Manejo de texto mixto
Por
omisión, el texto mixto simplemente se descarta en base a que, en caso de
estar presente, generalmente 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
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 en base a 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 en base a 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 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 predeterminadas del nodo de entrada
de flujo de mensajes. 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.
Si desea migrar al dominio
XMLNSC, al utilizar cabeceras MQRFH2,
es necesario el nuevo nombre de dominio en el campo
<Msd> de la carpeta <mcd>.
Tenga en cuenta que el nuevo nombre de dominio aparece en la cabecera
MQRFH2 del mensaje de salida. Para proteger las
aplicaciones externas de 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 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 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, o dejarlo como
XMLNS y establecer la propiedad Utilizar
analizador compacto XMLNSC para dominio XMLNS. El analizador
compacto se utiliza en el flujo y las vías de acceso ESQL
deben codificarse 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';
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';
SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)Encoding = 'UTF-8'; SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)StandAlone = 'Yes';
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 | 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';
Cómo utilizar EntityDefintion 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';
La
variable cursor se utiliza para apuntar a las variables
siguientes: dtn, el nombre de tipo de documento; edv,
el valor de definición de entidad; y el valor de Identifier.
Los valores de estas variables se obtienen del 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;
XMLNSC.EntityDefinition
se utiliza para definir la entidad author con un
valor de Book 1. Luego se crea una referencia a la
entidad author en el mensaje utilizando XMLNSC.EntityReference.
La variable cursor se utiliza para apuntar a las variables: dtn,
el nombre de tipo de documento; edn, el nombre de
definición de entidad; y el valor de Identifier. Estas
variables se derivan todas ellas del mensaje de entrada. El código
XMLNSC.DoubleAttribute se utiliza para añadir
comillas dobles a Identifier. Para añadir
sólo comillas simples a Identifier, se puede
utilizar XMLNSC.SingleAttribute.
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);