Sistemas de Información II
Tema 10. XPath




                 Carlos Castillo
                   UPF – 2007

            ...
XPath
Base para otras tecnologías
  XQuery
  XSLT
  XPointer
Lenguaje “básico” para buscar en XML
 Tan importante para doc...
Tecnologías interdependientes

    XQuery        XSLT          ...

       XPath (direccionamiento)



        XML (Modelo...
Ejemplo: 
      XQuery requiere XPath
<books­with­prices>
    { FOR $a in document(quot;A/bib.xmlquot;)//book,
    $b in d...
Ejemplo: 
        XSLT requiere XPath



<xsl:template match=quot;/docquot;>
        <otherdoc>
        <xsl:for­each sele...
Un documento como un árbol
                                         d.xml
                  d.xml        <Persona>
       ...
Una ruta en el árbol
                                              d.xml
                  d.xml             <Persona>
   ...
Objetivo de XPath
Identificar elementos
  A una profundidad arbitraria
  En base al conjunto de nodos en el camino
Importa...
Expresiones XPath
Tienen la forma
  nodo1/nodo2/.../nodoN
  En el ejemplo: persona/apellido/materno
Describen un camino (p...
Parecido a sist. de archivos
                         Nodos dentro de
Ficheros y directorios    nodos

Respecto a director...
Expresiones XPath
Falta: cómo seleccionar entre múltiples
posibilidades
    Para esto se usan predicados entre corchetes [...
Ventajas
Compacto, eficiente
  “Encontrar en la lista de autores el apellido
  de un autor que tenga el atributo tipo con
...
Rutas “child” (nodos hijo)
       doc.xml             child::fuente
<noticia>                   <fuente>upi</fuente>
 <tit...
“parent”, “ancestor”, “self”
       doc.xml             parent::cuerpo/parent::noticia
<noticia>                   <notici...
“attribute”,“descendant”,“root”
                           attribute::fecha
       doc.xml
<noticia>                     h...
“preceding”, “following”
       doc.xml             preceding::*
<noticia>                     <reportero cod=”3”>Juan 
 <...
Partición
<noticia>
                           Los ejes definen una particion
 <titulo>Título</titulo>
                   ...
Predicados (condiciones)
       doc.xml             reportero[@cod=2]
<noticia>                     (nada)
 <titulo>Título...
Resumen de sintaxis abreviada 
            1/2
X – hijo elemento “X”
* - todos los hijos elemento
text() - todos los hijos...
Resumen de sintaxis abreviada 
            2/2
//Y – descendientes “Y” de la RAIZ
//Y/X - descendientes “Y” de HIJO “X”
.....
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(T...
Buscar por contenido
       libros.xml
<libros>                 libro[titulo =
 <libro>
  <titulo>XXX</titulo>
           ...
Buscar con funciones
       libros.xml        concat(libro[1]/titulo,
<libros>
 <libro>
                          libro[2]...
Funciones básicas
       libros.xml
<libros>                 libro[position()=last()]/
 <libro>
  <titulo>XXX</titulo>
   ...
Funciones de strings (cont.)
Busqueda de caracteres
  substring­after( 'axbyc','x')='byc'
  substring­before( 'axbyc','x')...
Experimentar con XPath
http://www.zvon.org:9001/
/saxon/cgi-bin/XLab/XML/extras.html
Buscar “Zvon Xpath Xlab”




        ...
Procesamiento de XPath




                         27
XPath funciona como un filtro, 
  no como un procedimiento
               //*[position()=last()]
       No es ir buscando ...
Procesamiento XPath usando 
          DOM

1.- Cargar documento a memoria
  Usualmente 10x tamaño del documento
2.- Conver...
Ejemplo: //recipe[1]

public static void main(String[] args) {
      DOMParser p = new DOMParser();
      p.parse(args[0])...
Procesamiento XPath usando 
           SAX

1.- Procesar documento en línea
  Muy difícil de programar
2.- Evitar volver a...
Ejemplo de procesamiento 
        usando SAX
libro[@titulo = “X”]/autor
<libro titulo=”z”><autor>z_a</autor></libro>
<libr...
Problemas al buscar usando 
             SAX
libro[titulo=”X”]/autor
<libro><autor>z_a</autor><titulo>z</titulo>...
<libro...
Resumen
XPath
 Lenguaje para consultar XML
 Sintaxis abreviada
 Base para otros lenguajes
Procesar XPath
 Usando DOM
 Usan...
Upcoming SlideShare
Loading in …5
×

Bases de Datos - Parte 10/10 XPath

1,319
-1

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,319
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
120
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Bases de Datos - Parte 10/10 XPath

  1. 1. Sistemas de Información II Tema 10. XPath Carlos Castillo UPF – 2007 1
  2. 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. 3. Tecnologías interdependientes XQuery XSLT ... XPath (direccionamiento) XML (Modelo de datos) 3
  4. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 26. Experimentar con XPath http://www.zvon.org:9001/ /saxon/cgi-bin/XLab/XML/extras.html Buscar “Zvon Xpath Xlab” 26
  27. 27. Procesamiento de XPath 27
  28. 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. 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. 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. 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. 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. 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. 34. Resumen XPath Lenguaje para consultar XML Sintaxis abreviada Base para otros lenguajes Procesar XPath Usando DOM Usando SAX 34

×