Manipular mensajes utilizando el analizador XMLNSC

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

El analizador XMLNSC obtiene el árbol más compacto utilizando un solo elemento de nombre-valor para representar texto codificado, en lugar de los elementos de nombre y valor independientes utilizados por los analizadores XML y XMLNS. Examine el mensaje siguiente:
    <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.

Inicio del cambioLos dominios XML y XMLNS se diferencian en que los dos campos (Field1 y Field2) se representa cada unoFin del cambio mediante un elemento de nombre con un elemento de valor hijo. Es posible que estos parezca una diferencia pequeña, pero normalmente los mensajes tienen muchos campos hoja de este tipo, por ejemplo:
    <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.

Inicio del cambioLos 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.Fin del cambio

Atributos y texto codificado

Puesto que los atributos y el texto codificado se representan mediante elementos de nombre-valor, se distinguen por el uso de los tipos de elemento. Si no especifica un tipo, se presupone texto codificado. Por consiguiente, el primer mensaje de ejemplo mostrado más arriba pueden haberlo producido las sentencias SQL siguientes:
    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.

Inicio del cambioEn el dominio XMLNSC se definen las siguientes constantes para la creación de atributos:
   XMLNSC.SingleAttribute
   XMLNSC.DoubleAttribute
Fin del cambio
Inicio del cambioEn el dominio XMLNSC se define la siguiente constante para la selección de atributos:
   XMLNSC.Attribute
Fin del cambio
Inicio del cambioConsidere el siguiente mensaje de entrada XML:
    <Folder1 Item='ValueA'>
        <Item>Value1</Item>
    </Folder1>
Fin del cambio
Inicio del cambioPara eliminar la ambigüedad del nombre Item, que se utiliza como nombre de atributo y como nombre de campo en Folder01, se puede utilizar el siguiente ESQL:
    SET ItemAttributeValueHolder = InputRoot.XMLNSC.Folder1.(XMLNSC.Attribute)Item;
    SET ItemFieldValueHolder = InputRoot.XMLNSC.Folder1.(XMLNSC.Field)Item;
Fin del cambio

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

Inicio del cambioPor 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.Fin del cambio

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) Inicio del cambiose representa mediante un solo elemento Value sin nombre.Fin del cambio Los tipos de elemento de valor soportan PCDATA, CDATA y un híbrido que es una mezcla de los dos anteriores.

Aún no existe ningún comportamiento especial de los elementos de sintaxis en lo que concierne a la obtención y al establecimiento de valores. Sólo se puede acceder a los elementos Value desde el SQL dirigiéndose a ellos explícitamente. Con este fin, se proporcionan las siguientes constantes adicionales:
   XMLNSC.Value
   XMLNSC.PCDataValue
   XMLNSC.CDataValue
   XMLNSC.HybridValue
Inicio del cambioLa modalidad se controla estableciendo la Modalidad de retención de contenido mixto en el navegador del diálogo de propiedades Opciones de analizador XMLNSC en todos los nodos de análisis de mensajes, por ejemplo, el nodo MQInput. Para un control programado utilizando opciones de mensajes, se proporcionan las siguientes constantes:Fin del cambio
   XMLNSC.MixedContentRetainNone = 0x0000000000000000
   XMLNSC.MixedContentRetainAll  = 0x0001000000000000
Estas constantes se pueden utilizar en las cláusulas Option de la Sentencia CREATE de SQL (sección PARSE) y la Función ASBITSTREAM. Por ejemplo:
   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.

Inicio del cambioNo obstante, se proporciona una modalidad en la que, al realizar el análisis, los comentarios que aparecen en el documento (que no sea en la propia descripción de documento) se representan mediante un elemento de nombre-valor con el nombre Comment. Con este fin, se proporciona la siguiente constante adicional.
   XMLNSC.Comment
Fin del cambio
Inicio del cambioLa modalidad se controla estableciendo la Modalidad de retención de comentarios en el navegador del diálogo de propiedades Opciones de analizador XMLNSC en todos los nodos de análisis de mensajes, por ejemplo, el nodo MQInput. Para un control programado utilizando opciones de mensajes, se proporcionan las siguientes constantes:Fin del cambio
   XMLNSC.CommentsRetainNone = 0x0000000000000000
   XMLNSC.CommentsRetainAll  = 0x0002000000000000
Por 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.

No obstante, se proporciona una modalidad en la que, al realizar el análisis, las instrucciones de proceso que aparecen en el documento (que no sea en la propia descripción de documento) se representan mediante un elemento de nombre-valor con el nombre y el valor apropiados. Con este fin, se proporciona la siguiente constante adicional:
    XMLNSC.ProcessingInstruction
Inicio del cambioLa modalidad se controla estableciendo la Modalidad de retención de instrucciones de proceso en el navegador del diálogo de propiedades Opciones de analizador XMLNSC en todos los nodos de análisis de mensajes, por ejemplo, el nodo MQInput. Para un control programado utilizando opciones de mensajes, se proporcionan las siguientes constantes:Fin del cambio
    XMLNSC.ProcessingInstructionsRetainNone = 0x0000000000000000
    XMLNSC.ProcessingInstructionsRetainAll  = 0x0004000000000000
Por 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

Inicio del cambioPara utilizar el nuevo dominio y analizador XMLNSC, debe volver a codificar el ESQL para que utilice XMLNSC en las vías de acceso. Considere las siguientes sentencias ESQL:
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;
Fin del cambio
Inicio del cambioEn cada caso, la corriente de bits XML esperada en la cola de entrada y grabada en la cola de salida tiene el formato:
    <Person><Salary>42</Salary></Person>
Fin del cambio

Inicio del cambioLos 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.Fin del cambio

Inicio del cambioSi 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.Fin del cambio

Inicio del cambioSi 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.Fin del cambio

Inicio del cambioSi 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.Fin del cambio

Creación de cabeceras XML

El ESQL siguiente es válido en el dominio XML:
SET OutputRoot.XML.(XML.XmlDecl)*.(XML.Version)* = '1.0';
Para migrar a XMLNS, basta con cambiar la raíz (root) para realizar este trabajo:
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.

En el dominio XMLNSC, no hay ningún tipo especial para la versión XML; se trata simplemente como un atributo de la declaración XML. La sintaxis equivalente para el ejemplo anterior es:
SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)Version = '1.0';
Inicio del cambioDe manera similar, en el dominio XMLNSC el tipo de codificación XML y la modalidad autónoma XML también se procesan simplemente como atributos de la declaración XML y pueden configurarse en ESQL de las siguiente manera:
SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)Encoding = 'UTF-8';
SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)StandAlone = 'Yes';
Fin del cambio

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

La tabla siguiente proporciona los nombres de correlación para cada elemento de sintaxis XML. Cuando trabaje en el dominio XMLNSC, utilice estos nombres para hacer referencia a los elementos de los mensajes de entrada y para establecer elementos, atributos y valores en los mensajes de salida.
Tabla 1. Nombres de correlación para elementos de sintaxis XML
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
Notas:
  1. Tipo de documento sólo se utiliza para definiciones de entidad. Por ejemplo:
    SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)BodyDocument.(XMLNSC.EntityDefinition)TestDef =
     		          'Compact Tree Parser XML Test Module Version 1.0';
  2. La declaración XML es un tipo de carpeta especial que contiene elementos hijo para versión, codificación, etcétera. Por ejemplo:
    -- 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';

Inicio del cambioCómo utilizar EntityDefintion y EntityReference con el analizador XMLNSCFin del cambio

Inicio del cambioSe proporcionan dos ejemplos para mostrar cómo utilizar EntityDefintion y EntityReference con el analizador XMLNSC utilizando ESQL. Los dos ejemplos utilizan el mismo mensaje de entrada:
<BookInfo dtn="BookInfo" edn="author" edv="A.N.Other">
<Identifier>ES39B103T6</Identifier>
</BookInfo>
Fin del cambio
Inicio del cambioEl primer ejemplo muestra una forma de utilizar EntityDefintion y EntityReference con el analizador XMLNSC. Este es el mensaje de salida generado por el ejemplo:
<!DOCTYPE BookInfo [<!ENTITY author "A.N.Other">]>
<BookInfo><Identifier>ES39B103T7</Identifier><entref>&author;</entref></BookInfo>
Fin del cambio
Inicio del cambioEn el ESQL siguiente, XMLNSC.EntityDefinition se utiliza para definir la entidad de codificación fija author con un valor de A.N.Other que se obtiene del edv del mensaje de entrada. XMLNSC.EntityReference se utiliza para crear una referencia a la entidad author en el cuerpo del mensaje XML.
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';
Fin del cambio

Inicio del cambioLa 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.Fin del cambio

Inicio del cambioEste 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. Este es el mensaje de salida generado por el ejemplo, que muestra una definición de entidad llamada author y una referencia a la entidad en el cuerpo del mensaje XML:
<!DOCTYPE BookInfo [<!ENTITY author "Book 1">]>
<BookInfo Identifier="ES39B103T6">&author;</BookInfo>
Fin del cambio
Inicio del cambioEl ESQL siguienet utiliza EntityDefintion y EntityReference con el analizador XMLNSC para generar el mensaje de salida anterior:
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;
Fin del cambio

Inicio del cambioXMLNSC.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.Fin del cambio

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.

Las modalidades de analizador válidas para el analizador XMLNSC son:
XMLNSC.MixedContentRetainNone
XMLNSC.MixedContentRetainAll
XMLNSC.CommentsRetainNone
XMLNSC.CommentsRetainAll
XMLNSC.ProcessingInstructionsRetainNone
XMLNSC.ProcessingInstructionsRetainAll
El 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);
Conceptos relacionados
Visión general de flujos de mensajes
Analizadores y dominios XML
Visión general de ESQL
Tareas relacionadas
Diseñar un flujo de mensajes
Definir el contenido del flujo de mensajes
Manipular mensajes en el dominio XML
Referencia relacionada
Referencia de ESQL
Sentencia SET
Función FIELDVALUE
Función ASBITSTREAM
Sentencia CREATE
Avisos | Marcas registradas | Descargas | Biblioteca | Soporte | Su opinión
Copyright IBM Corporation 1999, 2006 Última actualización: 22/08/2006
ac26040_