XPath

De Wikipedia, la enciclopedia libre
Saltar a: navegación, búsqueda

XPath (XML Path Language) es un lenguaje que permite construir expresiones que recorren y procesan un documento XML. La idea es parecida a las expresiones regulares para seleccionar partes de un texto sin atributos (plain text). XPath permite buscar y seleccionar teniendo en cuenta la estructura jerárquica del XML. XPath fue creado para su uso en el estándar XSLT, en el que se usa para seleccionar y examinar la estructura del documento de entrada de la transformación.

Introducción[editar]

Todo el procesamiento realizado con un fichero XML está basado en la posibilidad de direccionar o acceder a cada una de las partes que lo componen, de modo que podamos tratar cada uno de los elementos de forma diferenciada.

El tratamiento del fichero XML comienza por la localización del mismo a lo largo del conjunto de documentos existentes en el mundo. Para llevar a cabo esta localización de forma unívoca, se utilizan los URI (Uniform Resource Identifiers), de los cuales los URL (Uniform Resource Locators) son sin duda los más conocidos.

Una vez localizado el documento XML, la forma de seleccionar información dentro de él es mediante el uso de XPath, que es la abreviación de lo que se conoce como XML Path Language. Con XPath podremos seleccionar y hacer referencia a texto, elementos, atributos y cualquier otra información contenida dentro de un fichero XML.

XPath en sí es un lenguaje sofisticado y complejo, pero distinto de los lenguajes procedurales que solemos usar (C, C++, Basic, Java...). Además, como casi todo en el mundo de XML, aún está en estado de desarrollo, por lo que no es fácil encontrar herramientas que incorporen todas sus funcionalidades.

XPath es a su vez la base sobre la que se han especificado nuevas herramientas que aprovechan para el tratamiento de documentos XML. Herramientas tales como XPointer, XLink y XQuery (el lenguaje que maneja los documentos XML como si de una base de datos se tratase). Así, XPath sirve para decir cómo una hoja de estilo debe procesar el contenido de una página XML, pero también para poder poner enlaces o cargar en un navegador zonas determinadas de una página XML, en vez de toda la página.

El modelo de datos de XPath[editar]

Un documento XML es procesado por un analizador (o parser) construyendo un árbol de nodos. Este árbol comienza con un elemento raíz, que se diversifica a lo largo de los elementos que cuelgan de él y acaba en nodos hoja, que contienen solo texto, comentarios, instrucciones de proceso o incluso que están vacíos y solo tienen atributos.

La forma en que XPath selecciona partes del documento XML se basa precisamente en la representación arbórea que se genera del documento. De hecho, los "operadores" de que consta este lenguaje nos recordarán la terminología que se utiliza a la hora de hablar de árboles en informática: raíz, hijo, ancestro, descendiente, etc.

Un caso especial de nodo son los nodos atributo. Un nodo puede tener tantos atributos como desee, y para cada uno se le creará un nodo atributo. No obstante, dichos nodos atributo NO se consideran como hijos suyos, sino más bien como etiquetas añadidas al nodo elemento.

A continuación se muestra un ejemplo de cómo se convierte en árbol un documento XML. Este mismo ejemplo será usado a lo largo de todo el tutorial. En primer lugar se muestra el documento XML y a continuación el árbol que genera.

Documento XML :

 <libro>
 
   <titulo>Dos por tres calles</titulo>
 
   <autor>Josefa Santos</autor>
 
   <capítulo num="1">
      La primera calle
  
     <parrafo>
       Era una sombría noche del mes de agosto...
     </parrafo>
   
     <parrafo destacar="si">
        Ella, inocente cual 
        <enlace href="enlace">mariposa</enlace> 
        que surca el cielo en busca de libaciones...
     </parrafo>
 
   </capitulo>
 
   <capítulo num="2" public="si">
     La segunda calle
 
     <parrafo>
        Era una obscura noche del mes de septiembre...
     </parrafo>
 
     <parrafo>
        Ella, inocente cual 
        <enlace href="enlace">abejilla</enlace> 
        que surca el viento en busca del néctar de las flores...
     </parrafo>
 
   </capitulo>
 
   <apéndice num="a" public="si">
     La tercera calle
 
     <parrafo>
        Era una densa noche del mes de diciembre...
     </parrafo>
 
     <parrafo>
        Ella, cándida cual 
        <enlace href="enlace">abejilla</enlace> 
        que surca el espacio en busca de bichejos para comer...
     </parrafo>
   </apendice>
 </libro>


Árbol generado :

 /
 +---libro
       |
       +---título
       |     |
       |     +---(texto)Dos por tres calles
       |
       +---autor
       |     |
       |     +---(texto)Josefa Santos
       |
       +---capitulo [num=1]
       |      |
       |      +---(texto)La primera calle
       |      |
       |      +---parrafo
       |      |     |
       |      |     +---(texto)Era una sombría noche ...
       |      |     
       |      +---parrafo [destacar=si]
       |            |
       |            +---(texto)Ella, cual inocente
       |            |
       |            +---enlace [href=enlace]
       |            |     |
       |            |     +---(texto)mariposa
       |            |
       |            +---(texto)que surca el cielo en busca de libaciones...
       |
       +---capitulo [num=2, public=si]
              |
              +---(texto)La segunda calle
              |
              +---parrafo
              |     |
              |     +---(texto)Era una obscura noche ...
              |     
              +---parrafo
                    |
                    +---(texto)Ella, cual inocente abeja...


Tipos de Nodos[editar]

Existen distintos tipos de nodos en un árbol generado a partir de un documento XML, a saber: raíz, elemento, atributo, texto, comentario e instrucción de procesamiento (respectivamente; root, elements, attribute, text, comment y processing instruction). Todo esto es muy beneficioso.

Nodo Raíz[editar]

Se identifica por /. No se debe confundir el nodo raíz con el elemento raíz del documento. Así, si el documento XML de nuestro ejemplo tiene por elemento raíz a libro, éste será el primer nodo que cuelgue del nodo raíz del árbol, el cual es: /.

Insisto: / hace referencia al nodo raíz del árbol, pero no al elemento raíz del documento XML, por más que un documento XML solo pueda tener un elemento raíz. De hecho, podemos afirmar que el nodo raíz del árbol contiene al elemento raíz del documento.

Nodo Elemento[editar]

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 son: nodos elemento, nodos texto, nodos comentario y nodos de instrucciones de proceso. Los nodos elemento también tienen propiedades tales como su nombre, sus atributos e información sobre los "espacios de nombre" que tiene activos.

Una propiedad interesante de los nodos elemento es que pueden tener identificadores únicos (para ello deben ir acompañados de un DTD que especifique que dichos atributos toman valores únicos), esto permite referenciar a dichos elementos de una forma mucho más directa.

Nodos texto[editar]

Por texto vamos a hacer referencia a todos los caracteres del documento que no están marcados con alguna etiqueta. Un nodo texto no tiene hijos, es decir, los distintos caracteres que lo forman no se consideran hijos suyos.

Nodos atributo[editar]

Como ya hemos indicado, los nodos atributo no son tanto hijos del nodo elemento que los contiene como etiquetas añadidas a dicho nodo elemento. Cada nodo atributo consta de un nombre, un valor (que es siempre una cadena) y un posible "espacio de nombres".

Aquellos atributos que tienen por valor el valor por defecto asignado en el DTD se tratarán como si el valor se les hubiese asignado al escribir el documento XML. Al contrario, no se crea nodo para atributos no especificados en el documento XML, y con la propiedad #IMPLIED definida en su DTD. Tampoco se crean nodos atributo para las definiciones de los espacios de nombre. Todo esto es normal si tenemos en cuenta que no es necesario tener un DTD para procesar un documento XML.

Nodos comentario y de instrucciones de proceso[editar]

Aparte de los nodos indicados, en el árbol también se generan nodos para cada nodo con comentarios y con instrucciones de proceso. Al contenido de estos nodos se puede acceder con la propiedad string-value.

Enlaces externos[editar]