Extracción de información de un mensaje utilizando XPath 1.0 y un nodo JavaCompute

XPath es un lenguaje de consulta diseñado para utilizarse con documentos XML, pero se puede aplicar a cualquier estructura en árbol para realizar consultas. WebSphere Message Broker utiliza XPath para seleccionar elementos del árbol lógico de mensaje independientemente del formato de la corriente de bits. Para obtener más información sobre XPath y la definición de W3C del estándar de XPath 1.0, consulte XPath. La terminología utilizada en este tema se basa en la terminología utilizada en la definición de W3C de XPath 1.0.

Este tema contiene la información siguiente:

Utilización del método evaluateXPath para extraer información de mensajes

El método evaluateXPath() se incluye en la API de nodo Java definida por el usuario y soporta XPath 1.0, con las siguientes excepciones:
  • El eje de espacio de nombres y el tipo de nodo de espacio de nombres. El eje de espacio de nombres devuelve los nodos de declaración de espacio de nombres XML reales para un elemento determinado. Esto le permite manipular el prefijo de XML o las declaraciones de URI en una expresión XPath. Este eje devuelve un conjunto de nodos vacío para las corrientes de bits que no son XML.
  • Si se utiliza la función id(), genera MbRecoverableException.

El método evaluateXPath() se puede llamar en un objeto MbMessage (para vías de acceso absolutas) o en un objeto MbElement (para vías de acceso relativas). La expresión XPath se pasa el método como un parámetro de serie de caracteres. Se proporciona una segunda forma de este método que toma un objeto MbXPath. Este objeto encapsula una expresión XPath junto con enlaces de variable y correlaciones de espacio de nombres, si son necesarios.

El método evaluateXPath() devuelve un objeto de uno de estos cuatro tipos, en función del tipo de retorno de expresión:
  • java.lang.Boolean, que representa el tipo booleano de XPath
  • java.lang.Double, que representa el tipo de número de XPath
  • java.lang.String, que representa el tipo de serie de caracteres de XPath
  • java.util.List, que representa el conjunto de nodos de XPath. La interfaz de lista representa una secuencia ordenada de objetos, en este caso MbElements. Permite el acceso directo a los elementos o la posibilidad de obtener un repetidor o una matriz de MbElement.

Enlace de variable de XPath

XPath 1.0 soporta la posibilidad de hacer referencia a variables dentro de una expresión que se han asignado antes de la evaluación. La clase MbXPath tiene tres métodos para asignar y eliminar estos enlaces de variable del código Java de usuario. El valor debe ser uno de los cuatro tipos soportados de XPath 1.0:
  • booleano
  • conjunto de nodos
  • número
  • serie de caracteres

Soporte de espacio de nombres de XPath

Para los mensajes XML, se hace referencia a los espacios de nombres utilizando una correlación desde un prefijo de espacio de nombres abreviado al URI de espacio de nombres completo, como se muestra en el siguiente ejemplo de XML:
<ns1:aaa xmlns:ns1='http://midominio.com/espacionombres1'
         xmlns:ns2='http://midominio.com/espacionombres2'>
  <ns2:aaa>
    <ns1:bbb/>
  </ns2:aaa>
</ns1:aaa>

Aunque el prefijo de espacio de nombres es conveniente para representar el espacio de nombres, sólo es significativo en el documento que define dicha correlación. Es el URI de espacio de nombres que define el significado global. Asimismo, el concepto de prefijo de espacio de nombres no es significativo para documentos que se generan en un flujo de mensajes porque se puede asignar un URI de espacio de nombres a un elemento de sintaxis sin que se haya definido una correlación xmlns.

Por esta razón los analizadores XMLNS(C) y MRM sólo exponen el URI de espacio de nombres al intermediario y al código de usuario (código de plug-in o ESQL). ESQL permite al usuario configurar sus propias correlaciones para crear abreviaciones de estos URI potencialmente largos. Estas correlaciones no están relacionadas de ninguna forma con los prefijos que se definen en el documento XML (aunque pueden tener el mismo nombre).

El procesador de XPath le permite correlacionar abreviaciones de espacio de nombres con los URI que se expanden durante la evaluación. La clase MbXPath contiene métodos para asignar y eliminar estas correlaciones de espacio de nombres. Se puede considerar el ejemplo de XML utilizando el código siguiente:
MbMessage msg = assembly.getMessage();
List chapters= (List)msg.evaluateXPath("/document/chapter");
// esto devuelve una lista de todos los capítulos del documento (longitud 1)

MbElement chapter = (MbElement)chapters.get(0);  // el primero

// también se pueden extraer valores directamente utilizando XPath
String title = (String)msg.evaluateXPath("string(/document/chapter/@title)");

String chapterText = (String)msg.evaluateXPath("string(/document/chapter/text())");

Actualización de un mensaje utilizando extensiones XPath

La implementación de WebSphere Message Broker de XPath proporciona las siguientes funciones adicionales para modificar el árbol de mensaje:
set-local-name(objeto)
Establece la parte local del nombre expandido del nodo de contexto en el valor especificado en el argumento. objeto puede ser cualquier expresión válida y se convierte en una serie de caracteres como si se utilizara una llamada a la función de serie de caracteres.
set-namespace-uri(objeto)
Establece la parte de URI de espacio de nombres del nombre expandido del nodo de contexto en el valor especificado en el argumento. objeto puede ser cualquier expresión válida y se convierte en una serie de caracteres como si se utilizara una llamada a la función de serie de caracteres.
set-value(objeto)
Esta función establece el valor de serie de caracteres del nodo de contexto en el valor especificado en el argumento. objeto puede ser cualquier expresión válida y se convierte en una serie de caracteres como si se utilizara una llamada a la función de serie de caracteres.
Para permitir que los árboles de elementos de sintaxis se cree y se modifiquen, está disponible el eje siguiente además de los 13 que están definidos en la especificación de XPath 1.0:
select-or-create::nombre or ?nombre
?nombre es equivalente a select-or-create::nombre. Si nombre es @name, se crea o se selecciona un atributo. Esto selecciona nodos hijo que coinciden con la prueba de nombre especificada o crea nodos nuevos de acuerdo con las normas siguientes:
  • ?nombre seleccione hijos denominados nombre si existen. Si no hay ningún hijo denominado nombre, ?nombre lo crea como el último hijo y, a continuación, lo selecciona.
  • ?$nombre crea nombre como el último hijo y, a continuación, lo selecciona.
  • ?^nombre crea nombre como el primer hijo y, a continuación, lo selecciona.
  • ?>nombre crea nombre como el hermano siguiente y, a continuación, lo selecciona.
  • ?<nombre crea nombre como el hermano anterior y, a continuación, lo selecciona.
Información relacionada
API Java de nodo definido por el usuario
Avisos | Marcas registradas | Descargas | Biblioteca | Soporte | Su opinión
Copyright IBM Corporation 1999, 2006 Última actualización: 22/08/2006
ac30390_