Your SlideShare is downloading. ×
Bases de Datos - Parte 10/10 XPath
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Bases de Datos - Parte 10/10 XPath

1,199
views

Published on

Published in: Technology

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,199
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
111
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Sistemas de Información II Tema 10. XPath Carlos Castillo UPF – 2007 1
  • 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
  • 3. Tecnologías interdependientes XQuery XSLT ... XPath (direccionamiento) XML (Modelo de datos) 3
  • 4. Ejemplo:  XQuery requiere XPath <books­with­prices>     { FOR $a in document(quot;A/bib.xmlquot;)//book,     $b in document(quot;B/reviews.xmlquot;)//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> 4
  • 5. Ejemplo:  XSLT requiere XPath <xsl:template match=quot;/docquot;>         <otherdoc>         <xsl:for­each select=quot;itemquot;>                 <otheritem>                      <xsl:value­of select=quot;sub­item/*quot;/>                 </otheritem>         </xsl:for­each>         </otherdoc> </xsl:template> </xsl:stylesheet> 5
  • 6. Un documento como un árbol d.xml d.xml <Persona>  <Apellido> Persona    <Paterno>      Perez    </Paterno>    <Materno> Apellido Email      Tapia Edad    </Materno>  </Apellido>  <Edad>42</Edad> 42  <Email>jperez@</Email> @ </persona> Paterno Materno P T 6
  • 7. Una ruta en el árbol d.xml d.xml <Persona>  <Apellido> Persona    <Paterno>      Perez    </Paterno>    <Materno> Apellido Email      Tapia Edad    </Materno>  </Apellido>  <Edad>42</Edad> 42  <Email>jperez@</Email> @ </persona> Paterno Materno P T /persona/apellido/paterno =  “Perez” 7
  • 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 8
  • 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
  • 16. “preceding”, “following” doc.xml preceding::* <noticia> <reportero cod=”3”>Juan   <titulo>Título</titulo> </reportero>  <fuente>upi</fuente>  <cuerpo fecha=”hoy”> following::p    <reportero cod=”3”> <p>Párrafo dos</p>     Juan    </reportero>    <p>Párrafo       <b>uno</b></p>    <p>Párrafo dos</p>  </cuerpo> </noticia> 16
  • 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
  • 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 21
  • 22. Buscar por contenido libros.xml <libros> libro[titulo =  <libro>   <titulo>XXX</titulo> 'XXX']/año   <año>1890</año>  </libro> 1890  <libro>   <titulo>YYY</titulo> libro[not(titulo =   <año>1950</año> 'XXX')]  </libro>  <libro> 1950   <año>1830</año>  <libro> </libros> 22
  • 23. Buscar con funciones libros.xml concat(libro[1]/titulo, <libros>  <libro> libro[2]/año)   <titulo>XXX</titulo>   <año>1890</año> XXX1950  </libro>  <libro> libro[starts-   <titulo>YYY</titulo> with(titulo,'X')]/año   <año>1950</año>  </libro> 1890  <libro>   <año>1830</año> libro[contains(año,9)]/  <libro> </libros> año 1950 23
  • 24. Funciones básicas libros.xml <libros> libro[position()=last()]/  <libro>   <titulo>XXX</titulo> año   <año>1890</año>  </libro> 1830  <libro>   <titulo>YYY</titulo> count(libro)   <año>1950</año>  </libro> 3  <libro>   <año>1830</año> libro[count(titulo)=0]/a  <libro> ño </libros> 1830 count(libro/titulo) 2 24
  • 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” 25
  • 26. Experimentar con XPath http://www.zvon.org:9001/ /saxon/cgi-bin/XLab/XML/extras.html Buscar “Zvon Xpath Xlab” 26
  • 27. Procesamiento de XPath 27
  • 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
  • 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(quot;recipequot;))          {            n = n.getNextSibling();         }   } 30
  • 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
  • 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>... 32
  • 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