0% encontró este documento útil (0 votos)
3 vistas17 páginas

Introducción a XPath en XML

XPath es un lenguaje utilizado para seleccionar nodos en documentos XML y calcular valores a partir de su contenido. Un documento XML se puede representar como un árbol, donde los nodos pueden ser de diferentes tipos, como elementos, atributos y texto. Las expresiones XPath permiten navegar por este árbol utilizando una sintaxis que incluye ejes, nodos de comprobación y predicados para filtrar resultados.

Cargado por

Fátima Soto
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
3 vistas17 páginas

Introducción a XPath en XML

XPath es un lenguaje utilizado para seleccionar nodos en documentos XML y calcular valores a partir de su contenido. Un documento XML se puede representar como un árbol, donde los nodos pueden ser de diferentes tipos, como elementos, atributos y texto. Las expresiones XPath permiten navegar por este árbol utilizando una sintaxis que incluye ejes, nodos de comprobación y predicados para filtrar resultados.

Cargado por

Fátima Soto
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Qué es XPath

XPath es un lenguaje que permite seleccionar nodos de un documento XML y calcular


valores a partir de su contenido.

Árbol del documento


Un grafo es un conjunto de objetos llamados nodos (o vértices) unidos por enlaces
llamados arcos o aristas.

Un árbol es un grafo en el que cualquier pareja de vértices está conectada por un


único camino (es decir, que no hay ciclos).

El nodo raíz de un árbol es


el único nodo sin padre. Los
nodos hermanos son los
nodos que tienen el mismo
padre.

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

Tipos de nodos
Un documento XML puede representarse como un árbol, 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:

● Raíz (/). Este tiene un único hijo que es la etiqueta que abarca todo el
documento.
● Elemento. Los elementos del documento son representados como
nodos elemento en el árbol (uno es el elemento raíz). Todos tienen un
padre (menos el raíz) y pueden tener muchos hijos de tipo elemento o
del resto de tipos que vemos a continuación.
● Atributo. Aunque se les denomina nodos, en la estructura del árbol no
se consideran hijos de los elementos a los que califican, sino que es una
información añadida a ellos, es como una etiqueta adosada al elemento.
No pueden tener descendientes.
● Texto. Estos sí que se consideran hijos de los elementos, aunque las
expresiones XPath suelen trabajar con nodos elementos y para referirse a los
atributos o al texto se utilizan notaciones especiales. No pueden tener
descendientes.
● Comentario. Contienen el texto de los comentarios.
● Instrucción de procesamiento. (<?....?>)
● Espacio de nombres. (xmlns:…)

Nota: La declaración DOCTYPE no se considera como nodo.

2
Ejemplo [Link]:

<?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>

se puede representar mediante el siguiente grafo:

3
Sintaxis de las expresiones XPath
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:

● sintaxis abreviada: más compacta y fácil de leer

● sintaxis completa: más larga pero con más opciones disponibles


Vemos la sintaxis abreviada.
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:

● eje: indica el nodo o los nodos en los que se realiza la búsqueda.

● nodo de comprobación: especifica el nodo o los nodos seleccionados dentro


del eje.

● predicado: permite restringir los nodos de comprobación.

4
Ejes
Indican el conjunto de nodos sobre los cuales se evaluará el nodo de comprobación y
el predicado. Se trata de realizar un primer filtro de nodos.

● /: si está al principio de la expresión, indica el nodo raíz, si no, indica "hijo".


● //: indica "descendiente" (hijos, hijos de hijos, etc.).
● @atributo: selecciona el valor del atributo.
● ..: selecciona el elemento padre.
● |: permite elegir varios recorridos.

El eje por defecto es el hijo.


Nodos de comprobación
Una vez identificado el conjunto de nodos con el eje adecuado, especificamos
exactamente qué nodos de ese conjunto son los que queremos.

● node(): selecciona todos los nodos (elementos y texto).


● text(): selecciona el contenido del elemento (texto). Selecciona los nodos de
tipo texto.
● *: selecciona todos los elementos (excepto los de tipo text).
● @*: selecciona todos los valores de los atributos.
● Nombre del nodo: selecciona todos los nodos con el nombre indicado.
● comment(): selecciona los nodos de comentario.

Predicados
Los predicados se escriben entre corchetes.

● [@atributo]: selecciona los elementos que tienen el atributo.

● [número]: si hay varios resultados selecciona uno de ellos por número de


orden; last() selecciona el último de ellos.
● Los predicados permiten definir condiciones sobre los valores de los atributos.
En las condiciones se pueden utilizar los operadores siguientes:
o operador de unión (OR lógico): |
o operadores lógicos: and, or, not()
o operadores aritméticos: +, -, *, div, mod
o operadores de comparación: =, !=, <, >, <=, >=
● [condicion]: selecciona los nodos que cumplen la condición. La condición
puede utilizar el valor de un atributo (utilizando @) o el texto que contiene el
elemento (utilizando .)

//fechaPublicacion[@año<1970]
//libro[autor='Mario Vargas Llosa']
//libro[fechaPublicacion/@año="1973"]

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.

5
Algunos ejercicios los haremos sobre [Link]

<?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>
<revista>
<titulo>Muy interesante</titulo>
<autor>Antonio Alonso</autor>
</revista>
</biblioteca>

6
Ejemplos:

/
/biblioteca/libro/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".

// (descendiente)
/biblioteca//autor <autor>Milan Kundera</autor>
<autor fechaNacimiento="28/03/1936">Mario Vargas
(autor descendiente de Llosa</autor>
<autor fechaNacimiento="28/03/1936">Mario Vargas
biblioteca) Llosa</autor>

//autor <autor>Milan Kundera</autor>


<autor fechaNacimiento="28/03/1936">Mario Vargas
(autor descendiente del raíz) Llosa</autor>
<autor fechaNacimiento="28/03/1936">Mario Vargas
Llosa</autor>
/autor//libro No devuelve nada porque "libro" no es descendiente
de "autor".

Sobre biblioteca2
//autor

(autor descendiente del raíz)

//revista//autor

(autor descendiente de revista)

//libro//autor

(autor descendiente de libro)

7
@atributo (valor del atributo)
/biblioteca/libro/autor/@fechaNacimiento

(valor del atributo fechaNacimiento del elemento autor)


/biblioteca/libro/@fechaNacimiento No devuelve nada porque "libro" no
tiene el atributo fechaNacimiento.
//fechaPublicacion/@año

(valor del atributo año de elemento fechaPublicacion


que es descendiente del raíz)

..
/biblioteca/libro/autor/@fechaNacimiento/..

(sólo salen los autores que tienen el atributo


fechaNacimiento)

/biblioteca/libro/autor/@fechaNacimiento/../..

(el primer libro no sale porque su autor no tiene


fecha de nacimiento)

|: permite elegir varios recorridos.


//autor|//titulo

(Salen todos los


autores y todos
los titulos)

8
node(): selecciona todos los nodos (elementos y texto).
//libro/node() <titulo>La vida está en otra parte</titulo>
<autor>Milan Kundera</autor>
(selecciona los hijos de libro; libro <fechaPublicacion año="1973"/>
<titulo>Pantaleón y las visitadoras</titulo>
sólo tiene hijos elementos) <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()

(selecciona los hijos de autor; autor


sólo tiene hijos texto)

text(): selecciona el contenido del elemento (nodos tipo texto).


//autor/text()

//libro/text() No devuelve nada porque "libro" no contiene texto.

//biblioteca/text() Biblioteca no tiene hijos de texto. No sale nada

//biblioteca//text()

(descendiente texto de biblioteca)

● *: selecciona todos los elementos excepto los de tipo texto.


//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>

9
//biblioteca//*

//autor/* No devuelve nada porque "autor" sólo contiene texto.

@*: selecciona todos los valores de los atributos


//@*

//libro/@* No devuelve nada porque "libro" no tiene


atributos.
//libro//@*

(todos los atributos de los descendientes


de libros)

//autor/@*

Devuelve los atributos de los autores

● [@atributo]: selecciona los elementos que tienen el atributo.


//autor[@fechaNacimiento]

(Muestra los autores que


tengan como atributo
fechaNacimiento)

//fechaPublicacion[@año]

(Muestra la fecha de
publicacion que tengan
como atributo año)

10
● [número]: si hay varios resultados selecciona uno de ellos por
número de orden; last() selecciona el último de ellos.
//libro[1]

(El primer libro)

//libro[last()]

(El ultimo libro)

//libro[last()-1]

El penultimo libro

● [condicion]: selecciona los nodos que cumplen la condición. La


condición puede utilizar el valor de un atributo (utilizando @) o el
texto que contiene el elemento (utilizando .)
//fechaPublicacion[@año<1970]

Muestra la fechaPublicacion cuyo atributo año


sea menor que 1970

//fechaPublicacion[@año<1970]/..

(libros publicados antes del 1970)

11
//libro[autor='Mario Vargas Llosa']

(libros cuyo autor es Mario Vargas Llosa)

//autor[.="Mario Vargas Llosa"]/..

(libros cuyo autor es Mario Vargas Llosa) El


punto significa el contenido de autor.

//libro[fechaPublicacion/@año="1973"]

(libros publicados en el año 1973)

//fechaPublicacion[@año=1973]/..

(libros publicados en el año 1973)

//libro[autor='Mario Vargas Llosa']/titulo

(títulos de los libros cuyo autor es Mario Vargas


Llosa)

12
● Se pueden escribir varios predicados seguidos (como si
estuvieran encadenados por la operación lógica and).
//libro[autor='Mario Vargas
Llosa'][fechaPublicacion/@año="1969"]

(libros cuyo autor es Mario Vargas Llosa y el


año de publicación es 1969)

//libro[autor='Mario Vargas Llosa' and


fechaPublicacion/@año="1969"]

Otros ejemplos:

(año en el que se publicó la novela “La vida está


en otra parte”)

//titulo[.="La vida está en otra


parte"]/../fechaPublicacion/@año

(títulos de los libros publicados en 1973)

//fechaPublicacion[@año=1973]/../titulo

13
ANEXO1:Sintaxis completa
Sintaxis:
eixo::test-nodo[predicado]

14
Abreviaturas de rutas de localización:

Nos predicados podemos usar todo o visto anteriormente e ademais funcións XPath:
Numéricas:

De cadea:

15
Conxunto de nodos:

Ejemplos [Link]:
<?xml version="1.0" encoding="UTF-8"?>
<libro titulo="Linguaxe de marcas. XML">
<!-- Este libro es muy importante -->
<capitulo titulo="Introducción a XML" numPaxinas="4">
<p>.p1 XML..</p>
</capitulo>
<capitulo titulo="Validación con DTDs" numPaxinas="6">
<p>.p1. HOLA DTDs.</p>
<p estilo="código">. p2 DTDs..</p>
</capitulo>
<capitulo titulo="Validación con XML Schemas" numPaxinas="17">
<p>.[Link].</p>
<p>.p2. HOLA …. ADIOS Schemas.</p>
<p estilo="resaltado">.p3 .Schemas.</p>
</capitulo>
<capitulo titulo="XPath" numPaxinas="7">
<!-- Este capitulo es principal -->
<p>.p1 XPath..</p>
<p>.p2 HOLA XPath..</p>
</capitulo>
<capitulo titulo="Transformacións XSLT" numPaxinas="15">
<p>.p1 XSLT..</p>
<p estilo="código">.[Link].</p>
<p>.p3 XSLT..</p>
<p>. p4 XSLT..</p>
</capitulo>
</libro>

16
Títulos dos capítulos que conteñen o texto 'Validación'
/libro/capitulo[contains(@titulo,"Validación")]/@titulo

Calcula o número de capítulos do libro


count(/libro/capitulo)

O primeiro parágrafo de cada capítulo


/libro/capitulo/p[1]
(tamén con [position()=1]) - Prohibido

O texto do último parágrafo de cada capítulo


/libro/capitulo/p[last()]/text()
(tamén con [position()=last()]) - Prohibido

//libro[position()<=2]

Ejercicios:
● Los dos primeros párrafos de cada capítulo.
//p[position()<=2]
● Títulos de los capítulos que tengan más de 6 páginas.
//capitulo[@numPáxinas>6]/@titulo
● Títulos de los capítulos que tengan párrafos con la palabra HOLA
//capitulo[contains(p,"HOLA")]/@titulo
Con esta primera solución el HOLA tiene que estar en el primer párrafo,
si está sólo en el segundo no funciona bien. Los dos siguientes sí
funcionan bien.
//capitulo/p[contains(.,"HOLA")]/../@titulo
//capitulo[p[contains(.,"HOLA")]]/@titulo
● Párrafos que contengan hola.
//p[contains(.,"HOLA")]
● Párrafos que contengan hola y adios.
//p[contains(.,"HOLA")][contains(.,"ADIOS")]
//p[contains(.,"HOLA") and contains(.,"ADIOS")]

ANEXO2:
Información sacada de: [Link]

Programa utilizado para evaluar las expresiones:


XPath Builder
[Link]

17

También podría gustarte