2. XPath
Base para otras tecnologías
XQuery
XSLT
XPointer
Lenguaje “básico” para buscar en XML
Tan importante para documentos
estructurados como es SQL para BD
relacionales
2
9. Expresiones XPath
Tienen la forma
nodo1/nodo2/.../nodoN
En el ejemplo: persona/apellido/materno
Describen un camino (path)
Resultado:
Un conjunto de nodos
String, número o boolean
El resultado podría no ser un doc. XML
9
10. Parecido a sist. de archivos
Nodos dentro de
Ficheros y directorios nodos
Respecto a directorio Respecto a nodo
actual actual o de contexto
* = cualquier cosa * = cualquier nodo
Un fichero por ruta Uno o varios nodos
por ruta
10
11. Expresiones XPath
Falta: cómo seleccionar entre múltiples
posibilidades
Para esto se usan predicados entre corchetes [ ... ]
Falta: cómo buscar en múltiples
documentos
No pueden realizar “joins”
11
12. Ventajas
Compacto, eficiente
“Encontrar en la lista de autores el apellido
de un autor que tenga el atributo tipo con
el valor clásico”
autores/autor[tipo='clasico']/apellido
Funciones básicas
Strings, números
12
13. Rutas “child” (nodos hijo)
doc.xml child::fuente
<noticia> <fuente>upi</fuente>
<titulo>Título</titulo>
<fuente>upi</fuente> child::*
<cuerpo fecha=”hoy”>
<titulo>...</cuerpo>
<reportero cod=”3”>
Juan child::text()
</reportero>
(nada)
<p>Párrafo
<b>uno</b></p> child::cuerpo/child::reportero
<p>Párrafo dos</p>
</cuerpo> <reportero>Juan</reportero>
</noticia> child::cuerpo/child::p/child::text()
Párrafo
Abreviado: “child::p” es igual a
“p”
13
14. “parent”, “ancestor”, “self”
doc.xml parent::cuerpo/parent::noticia
<noticia> <noticia>...</noticia>
<titulo>Título</titulo>
<fuente>upi</fuente> Abreviado: “parent::*” es igual a
<cuerpo fecha=”hoy”> “..”
<reportero cod=”3”>
../../fuente
Juan
</reportero> <fuente>upi</fuente>
<p>Párrafo
<b>uno</b></p> ancestor::noticia/titulo
<p>Párrafo dos</p> <titulo>Título<titulo>
</cuerpo>
</noticia> self::reportero
<reportero>Juan</reportero>
Abreviado: “self::*” es igual a “.”
14
15. “attribute”,“descendant”,“root”
attribute::fecha
doc.xml
<noticia> hoy
<titulo>Título</titulo> Abreviado: “attribute::x” es igual
<fuente>upi</fuente> a “@x”
<cuerpo fecha=”hoy”>
<reportero cod=”3”> reportero/@cod
Juan
3
</reportero>
<p>Párrafo descendant::b
<b>uno</b></p>
<p>Párrafo dos</p> <b>uno</b>
</cuerpo> Abreviado: “descendant::b” igual
</noticia> a “.//b“
.//noticia
<noticia>...</noticia>
p/b/text()
uno 15
17. Partición
<noticia>
Los ejes definen una particion
<titulo>Título</titulo>
No se intersectan como node-sets
<fuente>upi</fuente>
Ancestor
<cuerpo fecha=”hoy”> Preceding
<reportero cod=”3”> Following
Juan Self
</reportero> Descendant
<p>Párrafo Sí pueden ser uno child:: de otro
<b>uno</b></p>
<p>Párrafo dos</p>
</cuerpo>
</noticia>
17
18. Predicados (condiciones)
doc.xml reportero[@cod=2]
<noticia> (nada)
<titulo>Título</titulo>
<fuente>upi</fuente> p[position()=1]
<cuerpo fecha=”hoy”>
<p>Párrafo <b>uno</b></p>
<reportero cod=”3”>
Juan p[position()=last()]
</reportero>
<p>Párrafo dos</o>
<p>Párrafo
<b>uno</b></p> p[child::b] ó p[b]
<p>Párrafo dos</p>
</cuerpo> <p>Párrafo <b>uno</b></p>
</noticia> reportero[.='Juan']
<reportero cod=”3”> Juan
<reportero />
Se puede combinar ...
“/libro/capitulo[position()=3]/seccion[
position()=2]”
18
19. Resumen de sintaxis abreviada
1/2
X – hijo elemento “X”
* - todos los hijos elemento
text() - todos los hijos texto
@Y – atributo “Y”
X[1] – primer hijo “X”
X[last()] - último hijo “X”
*/X – nietos “X”
X//Y – descendientes “Y” de hijo “X”
19
20. Resumen de sintaxis abreviada
2/2
//Y – descendientes “Y” de la RAIZ
//Y/X - descendientes “Y” de HIJO “X”
.. - padre
//X[1][@Y=”Z”] - primeros hijos X con
atributo Y=”Z”
20
25. Funciones de strings (cont.)
Busqueda de caracteres
substringafter( 'axbyc','x')='byc'
substringbefore( 'axbyc','x')='a'
Los indices empiezan desde '1', tipico
de los estandares de XML
substring(“abcde”, 2, 4) = “bcd”
stringlength(“tres”) = 4
Traducir caracteres
string,fuente,destino
translate(“BAR”,”ABC”,”abc”) = “baR”
25
28. XPath funciona como un filtro,
no como un procedimiento
//*[position()=last()]
No es ir buscando el último hijo de cada nodo
Sí es ir verificando si cada nodo es un último hijo
doc.xml
<noticia> Respuesta correcta
<titulo>Titulo</titulo>
<fuente>upi</fuente> 1: <noticia> ...
<cuerpo fecha=quot;hoyquot;> </noticia>
<reportero cod=quot;3quot;> 2: <cuerpo>...</cuerpo>
Juan</reportero>
<p>Parrafo 3: <b>uno</b>
<b>uno</b></p> 4: <p>Parrafo dos</p>
<p>Parrafo dos</p>
</cuerpo>
</noticia>
28
29. Procesamiento XPath usando
DOM
1.- Cargar documento a memoria
Usualmente 10x tamaño del documento
2.- Convertir expresión en funciones
DOM
Muy fácil de programar
Ineficiente si lo que buscamos es un
fragmento pequeño en un documento
grande 29
31. Procesamiento XPath usando
SAX
1.- Procesar documento en línea
Muy difícil de programar
2.- Evitar volver atrás en el documento
A veces es inevitable
Estructuras necesarias
Consulta como lista de nodos
Stack (pila) con consulta parcialmente
resuelta
31
33. Problemas al buscar usando
SAX
libro[titulo=”X”]/autor
<libro><autor>z_a</autor><titulo>z</titulo>...
<libro><autor>x_a</autor><titulo>x</titulo>...
Casi siempre es necesario poder
devolverse
Necesitamos indexar estructura
33
34. Resumen
XPath
Lenguaje para consultar XML
Sintaxis abreviada
Base para otros lenguajes
Procesar XPath
Usando DOM
Usando SAX
34