XPath es un lenguaje de consulta diseñado para utilizarse con documentos XML, pero puede utilizarlo con cualquier estructura de árbol para realizar consultas de contenido.
WebSphere Message Broker utiliza
XPath para seleccionar elementos del árbol lógico de mensaje independientemente del formato
de la corriente de bits. La terminología utilizada en este tema se basa en la terminología utilizada en la
definición de W3C de XPath 1.0. Para obtener más información sobre XPath, consulte Utilización de XPath; y para obtener más información sobre la definición W3C del estándar XPath 1.0, consulte Especificación
W3C XPath 1.0.
Para ver ejemplos del uso de XPath, consulte el tema sobre MbXPath en la
documentación de API del nodo definido por el usuario Java.
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. Da soporte a 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 utiliza la función id(), se 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
da soporte a la capacidad de hacer referencia a variables que se han asignado antes de que se evalúe la expresión que las contiene. 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>
El prefijo de espacio de nombres
es conveniente para representar el espacio de nombres, pero sólo es
significativo en el documento que define dicha correlación. El URI de espacio de nombres 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 XMLNSC y
MRM sólo exponen el URI de espacio de nombres al intermediario y al código
de usuario (ESQL o código de usuario). Utilizando ESQL, puede configurar sus propias
correlaciones para crear abreviaturas para estas URI potencialmente largas. 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).
Con el procesador XPath puede correlacionar abreviaturas de espacios de nombres en 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. Por ejemplo:
MbXPath xp = new MbXPath("/aaa/other:aaa/bbb");
xp.addNamespacePrefix("other", "http://mydomain.com/namespace2");
xp.setDefaultNamespace("http://mydomain.com/namespace2");
List nodeset = (List)message.evaluateXPath(xp);
Actualización de un mensaje utilizando extensiones XPath
La implementación de XPath de
WebSphere Message Broker
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 el nombre
especificado 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.