Manipular mensajes en el dominio XMLNSC

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

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, 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.

Los dominios XML y XMLNS se diferencian en que los dos campos (Field1 y Field2) se representa cada uno mediante un elemento de nombre con un elemento de valor hijo. Es posible que esta diferencia parezca muy 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 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

Los atributos y el texto codificado se representan mediante elementos de nombre-valor y, por lo tanto, 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 anteriormente pueden haberlo producido las sentencias ESQL 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, 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.

En el dominio XMLNSC se definen las siguientes constantes para la creación de atributos:
XMLNSC.Attribute
XMLNSC.SingleAttribute
XMLNSC.DoubleAttribute
Observe el mensaje de entrada XML siguiente:
    <Folder1 Item='ValueA'>
        <Item>Value1</Item>
    </Folder1>
Para eliminar la ambigüedad del nombre Item, que se utiliza como nombre de atributo y como nombre de campo en Folder1, se puede utilizar el siguiente ESQL:
    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.

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 elementos de valor desde ESQL direccionándolos explícitamente. Con este fin, se proporcionan las siguientes constantes adicionales:
   XMLNSC.Value
   XMLNSC.PCDataValue
   XMLNSC.CDataValue
   XMLNSC.HybridValue
La modalidad se controla mediante la propiedad Retener contenido mixto en el separador Opciones de análisis de la vista Propiedades, 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:
   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 se eliminan porque son información auxiliar sin ningún significado para la empresa. No 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
La modalidad se controla estableciendo la propiedad Retener comentarios en el separador Opciones de análisis de la vista Propiedades, 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:
   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 se eliminan porque son información auxiliar sin ningún significado para la empresa. 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
La modalidad se controla mediante la propiedad Retener instrucciones de proceso en el separador Opciones de análisis de la vista Propiedades, 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:
    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 al dominio XMLNSC

Para utilizar el dominio y analizador XMLNSC, vuelva 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;
En cada caso, la corriente de bits XML que se espera en la cola de entrada y se graba en la cola de salida tiene el formato:
    <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

El ESQL siguiente es válido en el dominio XML:
SET OutputRoot.XML.(XML.XmlDecl)*.(XML.Version)* = '1.0';
Para migrar a XMLNS, cambie a root:
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.

En el dominio XMLNSC no hay ningún tipo especial para la versión XML; se trata 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';
De manera similar, en el dominio XMLNSC el tipo de codificación XML y la modalidad autónoma XML también se procesan como atributos de la declaración XML y pueden configurarse utilizando el ESQL siguiente:
SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)Encoding = 'UTF-8';
SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)StandAlone = 'Yes';
Para proporcionar la misma salida de un nodo JavaCompute, utilice el siguiente código de ejemplo:
//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
El resultado de este código es la aparición de la línea siguiente en el mensaje de salida:
<?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

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.
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
Notas:
  1. Tipo de documento sólo se utiliza para definiciones de entidades; 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';
  3. Estos valores de correlación representan muchos tipos de entidad posibles y no deben usarse para comprobaciones específicas en una sentencia (...) . Por ejemplo, IF FIELDTYPE(...) = XMLNSC.Attribute THEN ... no coincidirá nunca con nada debido a que el elemento podría ser un XMLNSC.SingleAttribute o un XMLNSC.DoubleAttribute.

Utilización de EntityDefinition y EntityReference con el analizador XMLNSC

Se proporcionan dos ejemplos para mostrar cómo utilizar EntityDefinition 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>
El primer ejemplo muestra cómo utilizar EntityDefinition y EntityReference con el analizador XMLNSC. El ejemplo genera el siguiente mensaje de salida:
<!DOCTYPE BookInfo [<!ENTITY author "A.N.Other">]>
<BookInfo><Identifier>ES39B103T7</Identifier><entref>&author;</entref></BookInfo>
En el ESQL siguiente, XMLNSC.EntityDefinition se utiliza para definir la entidad de codificación permanente 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';
La variable cursor se utiliza para apuntar a las variables siguientes:
  • El nombre de tipo de documento dtn
  • El valor de definición de entidad edv
  • El valor para Identifier
Los valores de estas variables se obtienen del mensaje de entrada.

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.

El ejemplo genera el mensaje de salida siguiente, 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>
El ESQL siguiente 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;
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 siguientes:
  • El nombre de tipo de documento dtn
  • El valor de definición de entidad edv
  • El valor para 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 y el código XMLNSC.SingleAttribute se utiliza para añadir comillas simples a 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.

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, 2009Copyright IBM Corporation 1999, 2009.
Última actualización : 2009-02-16 13:54:05

ac26040_