XPath: XML Path languageXPath es un lenguaje que permite seleccionar nodos de un documento XML y calcular valores a partir de su contenido. Existen dos versiones de XPath aprobadas por el W3C, XML Path Language 1.0 (noviembre de 1999) y XML Path Language 2.0 (enero de 2007). La más utilizada actualmente (marzo de 2011) es la versión 1.
Volver al principio de la página
XPath considera un documento XML como un árbol de nodos. En Informática, un árbol es una estructura de datos que equivale a un árbol matemático. En Matemáticas un árbol es un caso particular de grafo. Los siguientes términos definidos en teoría de grafos se utilizan también en Informática y en XPath:

Un grafo es un conjunto de objetos llamados nodos o
vértices unidos por enlaces llamados arcos o aristas. Un grafo
dirigido es un grafo en el que los arcos tienen dirección.
Cuando dos nodos están unidos por un arco con dirección, el nodo
padre es el nodo del que parte el arco y el nodo
hijo es el nodo al que llega el arco. 
Un árbol es un grafo en el que cualquier pareja de
vértices están conectada por un único camino (es decir, que no hay ciclos).
Un árbol dirigido es un árbol en el que las aristas tienen
dirección y todos los nodos menos uno tienen un único padre.
El nodo raíz de un árbol dirigido es el único
nodo sin padre. Los nodos hermanos son los nodos que
tienen el mismo padre.
Los nodos descendientes de un nodo son todos
los nodos a los que se llega desde el nodo: los hijos, los hijos de los
hijos, etc. Los nodos ascendientes de un nodo son todos
los nodos de los que un nodo es descendiente: el padre, el padre del padre,
etc.Un documento XML puede representarse como un árbol dirigido, considerando por ejemplo los elementos como nodos y que un elemento es padre de los elementos que contiene. Pero en XPath no sólo los elementos son nodos, en realidad hay siete tipos de nodos:
Nota: La declaración DOCTYPE no se considera como nodo.
Por ejemplo, el documento XML siguiente:
<?xml version="1.0" encoding="iso-8859-1"?>
<biblioteca>
<libro>
<titulo>La vida está en otra parte</titulo>
<autor>Milan Kundera</autor>
<fechaPublicacion año="1973"/>
</libro>
<libro>
<titulo>Pantaleón y las visitadoras</titulo>
<autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor>
<fechaPublicacion año="1973"/>
</libro>
<libro>
<titulo>Conversación en la catedral</titulo>
<autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor>
<fechaPublicacion año="1969"/>
</libro>
</biblioteca>
se puede representar mediante el siguiente grafo:

Los nodos atributos y de texto no son como los nodos elemento. Por ejemplo, los nodos atributo y de texto no pueden tener descendientes. En realidad el nodo atributo ni siquiera se considera como hijo, sino como una etiqueta adosada al elemento. El texto contenido por una etiqueta sí que se considera hijo del elemento, aunque las expresiones XPath suelen trabajar con nodos elementos y para referirse a los atributos o al texto se utilizan notaciones especiales.
Volver al principio de la página
Una expresión XPath es una cadena de texto que representa un recorrido en el árbol del documento. Las expresiones más simples se parecen a las rutas de los archivos en el explorador de Windows o en la shell de GNU/Linux.
Evaluar una expresión XPath es buscar si hay nodos en el documento que se ajustan al recorrido definido en la expresión. El resultado de la evaluación son todos los nodos que se ajustan a la expresión.
Las expresiones XPath se pueden escribir de dos formas distintas:
Las expresiones XPath se pueden dividir en pasos de búsqueda. Cada paso de búsqueda se puede a su vez dividir en tres partes:
Veamos unos ejemplos de expresiones XPath de sintaxis abreviada y el resultado de su evaluación en el documento de ejemplo anterior:
<?xml version="1.0" encoding="iso-8859-1"?>
<biblioteca>
<libro>
<titulo>La vida está en otra parte</titulo>
<autor>Milan Kundera</autor>
<fechaPublicacion año="1973"/>
</libro>
<libro>
<titulo>Pantaleón y las visitadoras</titulo>
<autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor>
<fechaPublicacion año="1973"/>
</libro>
<libro>
<titulo>Conversación en la catedral</titulo>
<autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor>
<fechaPublicacion año="1969"/>
</libro>
</biblioteca>
| /biblioteca/libro/autor | <autor>Milan Kundera</autor> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> |
| /autor | No devuelve nada porque "autor" no es hijo del nodo raíz. |
| /biblioteca/autor | No devuelve nada porque "autor" no es hijo de "biblioteca". |
| /biblioteca//autor | <autor>Milan Kundera</autor> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> |
| //autor | <autor>Milan Kundera</autor> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> |
| //autor//libro | No devuelve nada porque "libro" no es descendiente de "autor". |
| /biblioteca/libro/autor/@fechaNacimiento | fechaNacimiento="28/03/1936" fechaNacimiento="28/03/1936" |
| /biblioteca/libro/@fechaNacimiento | No devuelve nada porque "libro" no tiene el atributo fechaNacimiento. |
| /biblioteca/libro/autor/@fechaNacimiento/.. | <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> |
Nota: En este ejemplo se seleccionan únicamente los nodos "autor" que tienen el atributo fechaNacimiento.
| //autor|//titulo | <titulo>La vida está en otra parte</titulo> <autor>Milan Kundera</autor> <titulo>Pantaleón y las visitadoras</titulo> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> <titulo>Conversación en la catedral</titulo> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> |
| //libro/node() | <titulo>La vida está en otra parte</titulo> <autor>Milan Kundera</autor> <fechaPublicacion año="1973"/> <titulo>Pantaleón y las visitadoras</titulo> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> <fechaPublicacion año="1973"/> <titulo>Conversación en la catedral</titulo> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> <fechaPublicacion año="1969"/> |
| //autor/node() | Milan Kundera Mario Vargas Llosa Mario Vargas Llosa |
| //libro//node() | <titulo>La vida está en otra parte</titulo> La vida está en otra parte <autor>Milan Kundera</autor> Milan Kundera <fechaPublicacion año="1973"/> <titulo>Pantaleón y las visitadoras</titulo> Pantaleón y las visitadoras <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> Mario Vargas Llosa <fechaPublicacion año="1973"/> <titulo>Conversación en la catedral</titulo> Conversación en la catedral <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> Mario Vargas Llosa <fechaPublicacion año="1969"/> |
| //autor/text() | Milan Kundera Mario Vargas Llosa Mario Vargas Llosa |
| //libro/text() | No devuelve nada porque "libro" no contiene texto. |
| //libro/* | <titulo>La vida está en otra parte</titulo> <autor>Milan Kundera</autor> <fechaPublicacion año="1973"/> <titulo>Pantaleón y las visitadoras</titulo> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> <fechaPublicacion año="1973"/> <titulo>Conversación en la catedral</titulo> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> <fechaPublicacion año="1969"/> |
| //autor/* | No devuelve nada porque "autor" sólo contiene texto. |
| //libro//* | <titulo>La vida está en otra parte</titulo> <autor>Milan Kundera</autor> <fechaPublicacion año="1973"/> <titulo>Pantaleón y las visitadoras</titulo> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> <fechaPublicacion año="1973"/> <titulo>Conversación en la catedral</titulo> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> <fechaPublicacion año="1969"/> |
| //@* | año="1973" fechaNacimiento="28/03/1936" año="1973" fechaNacimiento="28/03/1936" año="1969" |
| //@* | año="1973" fechaNacimiento="28/03/1936" año="1973" fechaNacimiento="28/03/1936" año="1969" |
| //libro/@* | No devuelve nada porque "libro" no tiene atributos. |
| //autor/@* | fechaNacimiento="28/03/1936" fechaNacimiento="28/03/1936" |
Los predicados se escriben entre corchetes
| //autor[@fechaNacimiento] | <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> |
| //libro[1] | <libro> <titulo>La vida está en otra parte</titulo> <autor>Milan Kundera</autor> <fechaPublicacion año="1973"/> </libro> |
| //libro[last()] | <libro> <titulo>Conversación en la catedral</titulo> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> <fechaPublicacion año="1969"/> </libro> |
| //libro[last()-1] | <libro> <titulo>Pantaleón y las visitadoras</titulo> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> <fechaPublicacion año="1973"/> </libro> |
Los predicados permiten definir condiciones sobre los valores de los atributos. En las condiciones se pueden utilizar los operadores siguientes:
| //fechaPublicacion[@año<1970] | <fechaPublicacion año="1969"/> |
| //fechaPublicacion[@año<1970]/.. | <libro> <titulo>Conversación en la catedral</titulo> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> <fechaPublicacion año="1969"/> </libro> |
| //libro[autor='Mario Vargas Llosa'] | <libro> <titulo>Pantaleón y las visitadoras</titulo> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> <fechaPublicacion año="1973"/> </libro> <libro> <titulo>Conversación en la catedral</titulo> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> <fechaPublicacion año="1969"/> </libro> |
| //autor[.="Mario Vargas Llosa"]/.. | <libro> <titulo>Pantaleón y las visitadoras</titulo> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> <fechaPublicacion año="1973"/> </libro> <libro> <titulo>Conversación en la catedral</titulo> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> <fechaPublicacion año="1969"/> </libro> |
Se pueden escribir varios predicados seguidos, teniendo en cuenta que cada uno restringe los resultados del anterior, como si estuvieran encadenados por la operación lógica and.
| //libro[autor='Mario Vargas Llosa'][fechaPublicacion/@año="1969"] | <libro> <titulo>Conversación en la catedral</titulo> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> <fechaPublicacion año="1969"/> </libro> |
| //libro[autor='Mario Vargas Llosa' and fechaPublicacion/@año="1969"] | <libro> <titulo>Conversación en la catedral</titulo> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> <fechaPublicacion año="1969"/> </libro> |
Volver al principio de la página
Las expresiones XPath pueden anidarse, lo que permite definir expresiones más complicadas. Por ejemplo, en el documento utilizado anteriormente:
<?xml version="1.0" encoding="utf-8"?>
<biblioteca>
<libro>
<titulo>La vida está en otra parte</titulo>
<autor>Milan Kundera</autor>
<fechaPublicacion año="1973"/>
</libro>
<libro>
<titulo>Pantaleón y las visitadoras</titulo>
<autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor>
<fechaPublicacion año="1973"/>
</libro>
<libro>
<titulo>Conversación en la catedral</titulo>
<autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor>
<fechaPublicacion año="1969"/>
</libro>
</biblioteca>
Un ejemplo de expresión más complicada sería, por ejemplo, obtener los títulos de los libros publicados el mismo año que la novela "La vida está en otra parte". Esta información no está directamente almacenada en el documento, pero se puede obtener la respuesta en dos pasos:
| //titulo[.="La vida está en otra parte"]/../fechaPublicacion/@año | año="1973" |
| //fechaPublicacion[@año=1973]/../titulo | <titulo>La vida está en otra parte</titulo> <titulo>Pantaleón y las visitadoras</titulo> |
Estas dos expresiones se pueden unir en una única expresión, sustituyendo en la segunda expresión el valor 1973 por la primera expresión:
| //fechaPublicacion[@año=//titulo[.="La vida está en otra parte"]/../fechaPublicacion/@año]/../titulo | <titulo>La vida está en otra parte</titulo> <titulo>Pantaleón y las visitadoras</titulo> |
Volver al principio de la página
Esta página forma parte del curso "XML: Lenguaje de Marcas Extensible" disponible en http://www.mclibre.org
Esta obra está bajo una licencia de Creative
Commons.