SlideShare uma empresa Scribd logo
1 de 34
Baixar para ler offline
Sistemas de Información II
Tema 10. XPath




                 Carlos Castillo
                   UPF – 2007

                                   1
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
Tecnologías interdependientes

    XQuery        XSLT          ...

       XPath (direccionamiento)



        XML (Modelo de datos)




                                      3
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
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
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
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
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
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
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
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
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
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
“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
“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
“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
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
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
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
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
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
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
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
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
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
Experimentar con XPath
http://www.zvon.org:9001/
/saxon/cgi-bin/XLab/XML/extras.html
Buscar “Zvon Xpath Xlab”




                                      26
Procesamiento de XPath




                         27
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
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
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
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
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
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
Resumen
XPath
 Lenguaje para consultar XML
 Sintaxis abreviada
 Base para otros lenguajes
Procesar XPath
 Usando DOM
 Usando SAX




                               34

Mais conteúdo relacionado

Mais de Carlos Castillo (ChaTo)

Finding High Quality Content in Social Media
Finding High Quality Content in Social MediaFinding High Quality Content in Social Media
Finding High Quality Content in Social MediaCarlos Castillo (ChaTo)
 
Socia Media and Digital Volunteering in Disaster Management @ DSEM 2017
Socia Media and Digital Volunteering in Disaster Management @ DSEM 2017Socia Media and Digital Volunteering in Disaster Management @ DSEM 2017
Socia Media and Digital Volunteering in Disaster Management @ DSEM 2017Carlos Castillo (ChaTo)
 
Detecting Algorithmic Bias (keynote at DIR 2016)
Detecting Algorithmic Bias (keynote at DIR 2016)Detecting Algorithmic Bias (keynote at DIR 2016)
Detecting Algorithmic Bias (keynote at DIR 2016)Carlos Castillo (ChaTo)
 

Mais de Carlos Castillo (ChaTo) (20)

Finding High Quality Content in Social Media
Finding High Quality Content in Social MediaFinding High Quality Content in Social Media
Finding High Quality Content in Social Media
 
When no clicks are good news
When no clicks are good newsWhen no clicks are good news
When no clicks are good news
 
Socia Media and Digital Volunteering in Disaster Management @ DSEM 2017
Socia Media and Digital Volunteering in Disaster Management @ DSEM 2017Socia Media and Digital Volunteering in Disaster Management @ DSEM 2017
Socia Media and Digital Volunteering in Disaster Management @ DSEM 2017
 
Detecting Algorithmic Bias (keynote at DIR 2016)
Detecting Algorithmic Bias (keynote at DIR 2016)Detecting Algorithmic Bias (keynote at DIR 2016)
Detecting Algorithmic Bias (keynote at DIR 2016)
 
Discrimination Discovery
Discrimination DiscoveryDiscrimination Discovery
Discrimination Discovery
 
Fairness-Aware Data Mining
Fairness-Aware Data MiningFairness-Aware Data Mining
Fairness-Aware Data Mining
 
Big Crisis Data for ISPC
Big Crisis Data for ISPCBig Crisis Data for ISPC
Big Crisis Data for ISPC
 
Databeers: Big Crisis Data
Databeers: Big Crisis DataDatabeers: Big Crisis Data
Databeers: Big Crisis Data
 
Observational studies in social media
Observational studies in social mediaObservational studies in social media
Observational studies in social media
 
Natural experiments
Natural experimentsNatural experiments
Natural experiments
 
Content-based link prediction
Content-based link predictionContent-based link prediction
Content-based link prediction
 
Link prediction
Link predictionLink prediction
Link prediction
 
Recommender Systems
Recommender SystemsRecommender Systems
Recommender Systems
 
Graph Partitioning and Spectral Methods
Graph Partitioning and Spectral MethodsGraph Partitioning and Spectral Methods
Graph Partitioning and Spectral Methods
 
Finding Dense Subgraphs
Finding Dense SubgraphsFinding Dense Subgraphs
Finding Dense Subgraphs
 
Graph Evolution Models
Graph Evolution ModelsGraph Evolution Models
Graph Evolution Models
 
Link-Based Ranking
Link-Based RankingLink-Based Ranking
Link-Based Ranking
 
Text Indexing / Inverted Indices
Text Indexing / Inverted IndicesText Indexing / Inverted Indices
Text Indexing / Inverted Indices
 
Indexing
IndexingIndexing
Indexing
 
Text Summarization
Text SummarizationText Summarization
Text Summarization
 

Último

Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
Herramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxHerramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxRogerPrieto3
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdfIsabellaMontaomurill
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudianteAndreaHuertas24
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesFundación YOD YOD
 

Último (15)

Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
Herramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxHerramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptx
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdf
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento Protégeles
 

Bases de Datos - Parte 10/10 XPath

  • 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
  • 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