Dominando la Navegación XML con XPath: Tipos de Nodos y Sintaxis de Expresiones

Clasificado en Informática

Escrito el en español con un tamaño de 8,28 KB

Modelo de Datos y Tipos de Nodos en XPath

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 solo los elementos son nodos; en realidad, existen siete tipos fundamentales de nodos:

Tipos de Nodos Fundamentales

  • Raíz (Root): Se identifica por /. No se debe confundir el nodo raíz con el elemento raíz del documento.
  • Elemento: Cualquier elemento de un documento XML se convierte en un nodo elemento dentro del árbol. Cada elemento tiene su nodo padre. El nodo padre de cualquier elemento es, a su vez, un elemento, excepto el elemento raíz, cuyo padre es el nodo raíz. Los nodos elemento tienen a su vez hijos, que pueden ser nodos de cualquier tipo, excepto raíz.
  • Atributo: Son como etiquetas añadidas a dicho nodo. Cada nodo atributo consta de un nombre y un valor (que es siempre una cadena).
  • Texto: Referencia a todos los caracteres del documento que no están marcados con alguna etiqueta. Este no tiene hijos.
  • Comentario
  • Instrucción de procesamiento
  • Espacio de nombres (Namespace)

Tokens Válidos en una Expresión XPath

Los siguientes son los tokens y símbolos permitidos para construir expresiones válidas en XPath:

  • Paréntesis y Similares: ( ) { } [ ]
  • Navegación Relativa:
    • .: Elemento actual.
    • ..: Elemento padre.
  • Atributos y Separadores:
    • @: Atributo.
    • *: Comodín (cualquier elemento o atributo).
    • ::: Separador de eje (axis).
  • Otros Símbolos: La coma ,
  • Nombre de un Elemento
  • Tipo de Nodo: comment, text, processing-instruction, node
  • Operadores: and, or, mod, div, *, /, //, |, +, -, =, !=, <, <=, >, >=
  • Nombres de Función.
  • Nombre de Eje (Axis): ancestor, ancestor-or-self, attribute, child, descendant, descendant-or-self, following, following-sibling, namespace, parent, preceding, preceding-sibling, self
  • Literales: Entre comillas dobles o simples (se pueden anidar alternadas).
  • Números.
  • Referencias a Variables: $nombreVariable

Expresiones XPath Más Comunes

elemento
Elemento de nombre elemento.
/elemento
Elemento de nombre elemento ubicado en la raíz del documento.
e1/e2
e2 hijo directo de e1.
e1//e2
e2 descendiente (hijo, nieto, bisnieto, etc.) del elemento e1.
//elemento
Elemento de nombre elemento ubicado en cualquier nivel por debajo de la raíz del documento. (El operador // indica "descendiente").
@atributo
Atributo de nombre atributo.
*
Cualquier elemento (todos los elementos).
@*
Cualquier atributo (todos los atributos).
.
Nodo actual.
..
Nodo padre.

Funciones Esenciales de XPath

Funciones que Devuelven Elementos por su Posición

position() = n
Elemento que se encuentra en la n-ésima posición.
Elemento[n]
Elemento que se encuentra en la n-ésima posición.
last()
El último elemento de un conjunto.
last() - i
El elemento contando i posiciones antes del último.

Funciones que Devuelven Nodos

name()
Nombre del nodo actual.
root()
El elemento raíz.
node()
Nodos descendientes del actual.
comment()
Comentarios.
processing-instruction()
Instrucciones de procesamiento.

Funciones de Agregado

count()
Conteo de elementos.
avg()
Media o promedio de valores.
max()
Valor máximo.
min()
Valor mínimo.
sum()
Suma de valores.

Funciones Numéricas

round()
Redondeo. Ejemplo: round(3.14) = 3
abs()
Valor absoluto. Ejemplo: abs(-7) = 7
floor()
Suelo (entero menor o igual). Ejemplo: floor(7.3) = 7
ceiling()
Techo (entero mayor o igual). Ejemplo: ceiling(7.3) = 8

Funciones de Cadena (String)

substring()
Subcadena. Ejemplo: substring('Beatles', 1, 4) = 'Beat'
starts-with()
Verifica si la cadena comienza por. Ejemplo: starts-with('XML', 'X') = true
contains()
Verifica si la cadena contiene. Ejemplo: contains('XML', 'XM') = true
string-length()
Longitud de la cadena. Ejemplo: string-length('Beatles') = 7

Ejemplos Prácticos de Expresiones y Predicados

Uso del Descendiente (//)

El operador // indica "descendiente" (hijos, hijos de hijos, etc.).

Por ejemplo, la expresión:

//libro

Muestra todos los nodos libro, incluidos sus hijos correspondientes. Si ejecutamos //autor, nos mostrará todos los nodos autor en el documento.

Selección de Atributos (@)

El símbolo @atributo selecciona el atributo.

Por ejemplo, si ejecutamos:

/biblioteca/libro/autor/@fechaNacimiento

Obtenemos los valores del atributo fechaNacimiento (ejemplo de resultado: fechaNacimiento="28/03/1936").

Navegación al Padre de un Atributo

Podemos seleccionar el elemento padre de un atributo utilizando /... Veamos la expresión:

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

Nos devuelve el nodo elemento autor que contiene dicho atributo:

<autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor>

Selección de Contenido de Texto (text())

La función text() selecciona el contenido de texto de un elemento.

Por ejemplo:

//autor/text()

Predicados en XPath

Los predicados se utilizan para filtrar conjuntos de nodos y se escriben entre corchetes ([]).

Filtrado por Existencia de Atributo

El predicado [@atributo] selecciona los elementos que poseen el atributo especificado.

Por ejemplo:

//autor[@fechaNacimiento]

Devuelve todos los nodos autor que tienen el atributo fechaNacimiento.

Ejemplo de Consulta Compleja

Para obtener el año en que se publicó la novela "La vida está en otra parte", se puede usar una combinación de predicados y navegación:

//titulo[.="La vida está en otra parte"]/../fechaPublicacion/@año

Esto devuelve el valor del atributo año (ejemplo de resultado: año=”1973”).

Entradas relacionadas: