Bases de Datos - Parte 10/10 XPath

34
1 Sistemas de Información II Tema 10. XPath Carlos Castillo UPF – 2007

description

 

Transcript of Bases de Datos - Parte 10/10 XPath

Page 1: Bases de Datos - Parte 10/10 XPath

1

Sistemas de Información II

Tema 10. XPath

Carlos Castillo

UPF – 2007

Page 2: Bases de Datos - Parte 10/10 XPath

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

Page 3: Bases de Datos - Parte 10/10 XPath

3

Tecnologías interdependientes

XML (Modelo de datos)

XPath (direccionamiento)

XQuery XSLT ...

Page 4: Bases de Datos - Parte 10/10 XPath

4

Ejemplo: XQuery requiere XPath

<books­with­prices>    { FOR $a in document("A/bib.xml")//book,    $b in document("B/reviews.xml")//entry    WHERE $b/title = $a/title    RETURN    <book­with­prices>      { $b/title }      <price­A>        { $a/price/text() }      </price­A>      <price­B>        { $b/price/text() }      </price­B>    </book­with­prices>    }  </books­with­prices>

Page 5: Bases de Datos - Parte 10/10 XPath

5

Ejemplo: XSLT requiere XPath

<xsl:template match="/doc">        <otherdoc>        <xsl:for­each select="item">                <otheritem>                     <xsl:value­of select="sub­item/*"/>                </otheritem>        </xsl:for­each>        </otherdoc></xsl:template></xsl:stylesheet>

Page 6: Bases de Datos - Parte 10/10 XPath

6

Un documento como un árbol

@42

d.xml

Email Edad

Persona

Apellido

TP

MaternoPaterno

<Persona> <Apellido>   <Paterno>     Perez   </Paterno>   <Materno>     Tapia   </Materno> </Apellido> <Edad>42</Edad> <Email>jperez@</Email></persona>

d.xml

Page 7: Bases de Datos - Parte 10/10 XPath

7

Una ruta en el árbol

@42

d.xml

Email Edad

Persona

Apellido

TP

MaternoPaterno

<Persona> <Apellido>   <Paterno>     Perez   </Paterno>   <Materno>     Tapia   </Materno> </Apellido> <Edad>42</Edad> <Email>jperez@</Email></persona>

d.xml

/persona/apellido/paterno= 

“Perez”

Page 8: Bases de Datos - Parte 10/10 XPath

8

Objetivo de XPath

Identificar elementos

A una profundidad arbitraria

En base al conjunto de nodos en el camino

Importante: siempre hay un nodo de contexto

Page 9: Bases de Datos - Parte 10/10 XPath

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

Page 10: Bases de Datos - Parte 10/10 XPath

10

Parecido a sist. de archivos

Ficheros y directorios

Respecto a directorio actual

* = cualquier cosa

Un fichero por ruta

Nodos dentro de nodos

Respecto a nodo actual o de contexto

* = cualquier nodo

Uno o varios nodos por ruta

Page 11: Bases de Datos - Parte 10/10 XPath

11

Expresiones XPathFalta: 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”

Page 12: Bases de Datos - Parte 10/10 XPath

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

Page 13: Bases de Datos - Parte 10/10 XPath

13

Rutas “child” (nodos hijo)

<noticia> <titulo>Título</titulo> <fuente>upi</fuente> <cuerpo fecha=”hoy”>   <reportero cod=”3”>    Juan   </reportero>   <p>Párrafo      <b>uno</b></p>   <p>Párrafo dos</p> </cuerpo></noticia>

child::fuente

<fuente>upi</fuente>

child::*

<titulo>...</cuerpo>

child::text()

(nada)

child::cuerpo/child::reportero

<reportero>Juan</reportero>

child::cuerpo/child::p/child::text()

Párrafo

Abreviado: “child::p” es igual a “p”

doc.xml

Page 14: Bases de Datos - Parte 10/10 XPath

14

“parent”, “ancestor”, “self”

<noticia> <titulo>Título</titulo> <fuente>upi</fuente> <cuerpo fecha=”hoy”>   <reportero cod=”3”>    Juan   </reportero>   <p>Párrafo      <b>uno</b></p>   <p>Párrafo dos</p> </cuerpo></noticia>

parent::cuerpo/parent::noticia

<noticia>...</noticia>

Abreviado: “parent::*” es igual a “..”

../../fuente

<fuente>upi</fuente>

ancestor::noticia/titulo

<titulo>Título<titulo>

self::reportero

<reportero>Juan</reportero>

Abreviado: “self::*” es igual a “.”

doc.xml

Page 15: Bases de Datos - Parte 10/10 XPath

15

“attribute”,“descendant”,“root”

<noticia> <titulo>Título</titulo> <fuente>upi</fuente> <cuerpo fecha=”hoy”>   <reportero cod=”3”>    Juan   </reportero>   <p>Párrafo      <b>uno</b></p>   <p>Párrafo dos</p> </cuerpo></noticia>

attribute::fecha

hoy

Abreviado: “attribute::x” es igual a “@x”

reportero/@cod

3

descendant::b

<b>uno</b>

Abreviado: “descendant::b” igual a “.//b“

.//noticia

<noticia>...</noticia>

p/b/text()

uno

doc.xml

Page 16: Bases de Datos - Parte 10/10 XPath

16

“preceding”, “following”

<noticia> <titulo>Título</titulo> <fuente>upi</fuente> <cuerpo fecha=”hoy”>   <reportero cod=”3”>    Juan   </reportero>   <p>Párrafo      <b>uno</b></p>   <p>Párrafo dos</p> </cuerpo></noticia>

preceding::*

<reportero cod=”3”>Juan </reportero>

following::p

<p>Párrafo dos</p>

doc.xml

Page 17: Bases de Datos - Parte 10/10 XPath

17

Partición<noticia>

 <titulo>Título</titulo>

 <fuente>upi</fuente>

 <cuerpo fecha=”hoy”>

   <reportero cod=”3”>

    Juan

   </reportero>

   <p>Párrafo

      <b>uno</b></p>

   <p>Párrafo dos</p>

 </cuerpo>

</noticia>

Los ejes definen una particion

No se intersectan como node-sets

Ancestor

Preceding

Following

Self

Descendant

Sí pueden ser uno child:: de otro

Page 18: Bases de Datos - Parte 10/10 XPath

18

Predicados (condiciones)

<noticia> <titulo>Título</titulo> <fuente>upi</fuente> <cuerpo fecha=”hoy”>   <reportero cod=”3”>    Juan   </reportero>   <p>Párrafo      <b>uno</b></p>   <p>Párrafo dos</p> </cuerpo></noticia>

reportero[@cod=2]

(nada)

p[position()=1]

<p>Párrafo <b>uno</b></p>

p[position()=last()]

<p>Párrafo dos</o>

p[child::b] ó p[b]

<p>Párrafo <b>uno</b></p>

reportero[.='Juan']

<reportero cod=”3”> Juan <reportero />

Se puede combinar ... “/libro/capitulo[position()=3]/seccion[position()=2]”

doc.xml

Page 19: Bases de Datos - Parte 10/10 XPath

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”

Page 20: Bases de Datos - Parte 10/10 XPath

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”

Page 21: Bases de Datos - Parte 10/10 XPath

21

Valor de text() de un nodo

text(<p>Este es <b>un nodo</b></p>)

Este es un nodo

text(<p/>)

(nada, string vacio)

text(Texto)

Texto

Page 22: Bases de Datos - Parte 10/10 XPath

22

Buscar por contenido

libro[titulo = 'XXX']/año

1890

libro[not(titulo = 'XXX')]

1950

<libros> <libro>  <titulo>XXX</titulo>  <año>1890</año> </libro> <libro>  <titulo>YYY</titulo>  <año>1950</año> </libro> <libro>  <año>1830</año> <libro></libros>

libros.xml

Page 23: Bases de Datos - Parte 10/10 XPath

23

Buscar con funcionesconcat(libro[1]/titulo, libro[2]/año)

XXX1950

libro[starts-with(titulo,'X')]/año

1890

libro[contains(año,9)]/año

1950

<libros> <libro>  <titulo>XXX</titulo>  <año>1890</año> </libro> <libro>  <titulo>YYY</titulo>  <año>1950</año> </libro> <libro>  <año>1830</año> <libro></libros>

libros.xml

Page 24: Bases de Datos - Parte 10/10 XPath

24

Funciones básicas

libro[position()=last()]/año

1830

count(libro)3

libro[count(titulo)=0]/año

1830

count(libro/titulo)2

<libros> <libro>  <titulo>XXX</titulo>  <año>1890</año> </libro> <libro>  <titulo>YYY</titulo>  <año>1950</año> </libro> <libro>  <año>1830</año> <libro></libros>

libros.xml

Page 25: Bases de Datos - Parte 10/10 XPath

25

Funciones de strings (cont.)Busqueda de caracteres

substring­after( 'axbyc','x')='byc'

substring­before( 'axbyc','x')='a'

Los indices empiezan desde '1', tipico de los estandares de XML

substring(“abcde”, 2, 4) = “bcd”

string­length(“tres”) = 4

Traducir caracteres string,fuente,destino

translate(“BAR”,”ABC”,”abc”) = “baR”

Page 26: Bases de Datos - Parte 10/10 XPath

26

Experimentar con XPath

http://www.zvon.org:9001/

/saxon/cgi-bin/XLab/XML/extras.html

Buscar “Zvon Xpath Xlab”

Page 27: Bases de Datos - Parte 10/10 XPath

27

Procesamiento de XPath

Page 28: Bases de Datos - Parte 10/10 XPath

28

XPath funciona como un filtro, no como un procedimiento

<noticia><titulo>Titulo</titulo><fuente>upi</fuente><cuerpo fecha="hoy"> <reportero cod="3"> Juan</reportero> <p>Parrafo <b>uno</b></p> <p>Parrafo dos</p></cuerpo></noticia>

1: <noticia> ... </noticia>2: <cuerpo>...</cuerpo>3: <b>uno</b>4: <p>Parrafo dos</p>

//*[position()=last()]

doc.xmlRespuesta correcta

No es ir buscando el último hijo de cada nodoSí es ir verificando si cada nodo es un último hijo

Page 29: Bases de Datos - Parte 10/10 XPath

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

Page 30: Bases de Datos - Parte 10/10 XPath

30

Ejemplo: //recipe[1]

public static void main(String[] args) {      DOMParser p = new DOMParser();      p.parse(args[0]);      Document doc = p.getDocument();      Node n = doc.getDocumentElement();

n = n.getFirstChild();      while (n!=null &&        !n.getNodeName().equals("recipe"))         {           n = n.getNextSibling();        }  }

Page 31: Bases de Datos - Parte 10/10 XPath

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

Page 32: Bases de Datos - Parte 10/10 XPath

32

Ejemplo de procesamiento usando SAX

libro[@titulo = “X”]/autor<libro titulo=”z”><autor>z_a</autor></libro>

<libro titulo=”x”><autor>x_a</autor></libro>

libro[titulo=”X”]/autor<libro><titulo>z</titulo><autor>z_a</autor>...

<libro><titulo>x</titulo><autor>x_a</autor>...

Page 33: Bases de Datos - Parte 10/10 XPath

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

Page 34: Bases de Datos - Parte 10/10 XPath

34

Resumen

XPath

Lenguaje para consultar XML

Sintaxis abreviada

Base para otros lenguajes

Procesar XPath

Usando DOM

Usando SAX