sintesis

dom

Códigos disponibles en git

¿Por qué?

clienteWeb
Otros navegadores Web:
  • Flock, Midori, Arora, que comparten con Safari y Chrome el motor de visualización (render) WebKit basado en el motor KHTML de navegador Konqueror.

  • AOL Explorer, … que comparte el motor Trindent con IExplorer.

  • Camino, Galeon, … que comparten el motor Gecko con Mozilla Firefox.

ClienteWEB
Batallas de los Navegadores
  • I Batalla entre Navigator de Netscape e IExplorer de Microsoft en los 90’.

    • Inicialmente ganada por Navigator y con resolución judicial a favor de Netscape por carácter monopolista de Microsoft pero éste finalmente surgió ganador en el mercado.

batallaNavegadoresI

  • II Batalla actual desde el 2003 entre los “3 grandes”, IExplorer, Firefox, Chrome,

    • o los “5 grandes”, incluyendo Safari y Opera

¿Qué?

contexto

Para qué?

Eficiencia, gracias a un estándar, todos igual de la misma manera: sencillo
<!DOCTYPE html>
<html>
<body>
<h2>Finding HTML Elements Using document.anchors</h2>
<a name="html">HTML Tutorial</a><br>
<a name="css">CSS Tutorial</a><br>
<a name="xml">XML Tutorial</a><br>
<p id="demo"></p>
<script>
document.getElementById("demo") .innerHTML = (1)
"Number of anchors are: " + document.anchors.length;
</script>
</body>
</html>
import org.w3c.dom.*;
import javax.xml.parsers.*;
public class TestGetElementById {
    public static void main(String[] args) throws Exception {
        String widgetXMLFile = "piechart.xml";
        DocumentBuilderFactory domFactory = DocumentBuilderFactory. newInstance();
        domFactory.setNamespaceAware (true);
        DocumentBuilder docBuilder = domFactory. newDocumentBuilder();
        Document doc = docBuilder. parse(widgetXMLFile);
        Node n = doc.getElementById("/chart/legend"); (1)
        Element newNode = doc.createElement("root");
        n.appendChild(newNode);
    }
}
<?php
$doc = new DomDocument;
$doc->validateOnParse = true;
$doc->Load('book.xml');
echo "The element whose id is 'php-basics' is: " . $doc->getElementById('php-basics')->tagName . "\n";
?>

¿Cómo?

Modelo del Objeto Documento

Diagrama de clases: Tipos de nodos:

nodes

Tutorial: CDATA_SECTION_NODE, ENTITY_NODE, DOCUMENT_FRAGMENT_NODE, NOTATION_NODE, …​

<?xml version = "1.0"?>
<Company>
   <Employee category = "technical">
      <FirstName>Tanmay</FirstName>
      <LastName>Patil</LastName>
      <ContactNo>1234567890</ContactNo>
   </Employee>

   <Employee category = "non-technical">
      <FirstName>Taniya</FirstName>
      <LastName>Mishra</LastName>
      <ContactNo>1234667898</ContactNo>
   </Employee>
</Company>

Diagrama de objetos: DOM de documento XML:

ejemploDOM
XPointer XLink XQuery XSLT
  • proporciona una forma de identificar de forma única fragmentos de un documento XML con el objetivo de realizar vínculos

  • permite crear una relación de vínculos entre varios documentos, agregar a un vínculo información acerca del mismo (metadatos), crear y describir vínculos a documentos en multitud de ubicaciones

  • es un lenguaje de consulta diseñado para colecciones de datos XML, semánticamente similar a SQL, aunque incluye algunas capacidades de programación

  • forma de transformar documentos XML en otros e incluso a formatos que no son XML, pdf, rtf, text, …​

XLink y XPointer XQuery XSLT
<?xml version="1.0" encoding="ISO-8859-1"?>

<mydogs xmlns:xlink = "http://www.w3.org/1999/xlink">

<mydog xlink:type="simple"
xlink:href = "http://dog.com/ dogbreeds.xml#Rottweiler"> (1)
<description xlink:type="simple"
xlink:href = "http://myweb.com/ mydogs/anton.gif">
Anton is my favorite dog. He has won a lot of.....
</description>
</mydog>

<mydog xlink:type="simple"
xlink:href = "http://dog.com/ dogbreeds.xml#FCRetriever"> (2)
<description xlink:type="simple"
xlink:href = "http://myweb.com/ mydogs/pluto.gif">
Pluto is the sweetest dog on earth......
</description>
</mydog>

</mydogs>
1 XPath: dogbreeds.xml#Rottweiler
2 XPath: dogbreeds.xml#FCRetriever
<html><head/><body>
{
  for $act in doc("hamlet.xml") //ACT
  let $speakers := distinct-values($act//SPEAKER)
  return
    <span>
      <h1>{ $act/TITLE/text() }</h1> (1)
      <ul>
      {
        for $speaker in $speakers
        return <li>{ $speaker }</li>
      }
      </ul>
    </span>
}
</body></html>
1 XPath: $act/TITLE/text()
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl = "http://www.w3.org/       1999/XSL/Transform">

  <xsl:output method="text"/>

  <xsl:template match="/"> (1)
    Article - <xsl:value-of select = "/Article/Title"/> (2)
    Authors: <xsl:apply-templates select = "/Article/Authors/Author"/> (3)
  </xsl:template>

  <xsl:template match="Author">
    - <xsl:value-of select="." /> (4)
  </xsl:template>

</xsl:stylesheet>
1 XPath: /
2 XPath: /Article/Title
3 XPath: /Article/Authors/Author
4 XPath: .

tecnologiasXML

XPath

Definición Retorno Documentación
  • es un estándar W3C que utiliza expresiones de ruta para navegar en documentos XML que contiene una biblioteca de funciones estándar

  • la evaluación de las expresiones devuelven:

    • secuencias de nodos

    • valores lógicos, númericos o cadena de caracteres

Rutas

  • Sintaxis:

    • <xpath> ::= <rutaAbsoluta>

    • <rutaAbsoluta> ::= / [ <rutaRelativa> { / <rutaRelativa> }* ]

    • <rutaRelativa> ::= [ <eje> ] <prueba> [ <predicado> ]

  • Semántica:

  • Ruta absoluta: se parte de un conjunto de nodos compuesto por el nodo documento

  • Ruta relativa: se parte de un conjunto de nodos obtenida por la ruta anterior

  • Para cada elemento del conjunto de nodos anterior, llamado nodo contextual,

    • Se obtiene el conjunto de nodos del eje aplicado al nodo contextual

    • Se filtran con la prueba los nodos del conjunto de nodos anterior

    • Se flitran con el predicado los nodos del conjunto de nodos anterior

    • El conjunto de nodos resultante, es la unión de todos los conjuntos de nodos resultantes

Ejes

  • Sintaxis:

    • <eje> ::= ( parent | ancestor | ancestor-or-self | child | descendant | descendant-or-self | self | following | following-sibling | preceding | preceding-sibling | namespace | attribute ) :: | . | .. | @

  • Semántica: según el eje, se selecciona el conjunto de nodos que cumplen el eje a partir del nodo contextual

    • Abreviaturas:

      • por defecto equivalente a child::

      • . equivalente a self::

      • .. equivalente a parent::

      • @ equivalente a attribute::

  • parent, lista de nodos con el padre del nodo contexto

  • ancestor, lista de nodos desde el padre del nodo contexto hasta el nodo raíz

  • ancestor-or-self, lista de nodos desde el nodo de contexto hasta el nodo raíz

  • child, lista de nodos con hijos del nodo contexto

  • descendant, lista de nodos con descendientes del nodo contexto

  • descendant-or-self, lista de nodos con el nodo de contexto

  • self, lista de nodos con el nodo contexto

  • following, lista de nodos superiores en preorden al nodo contexto sin contemplar los descendientes

  • following-sibling, lista de nodos hermanos superiores en preorden al nodo contexto

  • preceding, lista de nodos inferiores en preorden al nodo contexto sin contemplar los ancestros

  • preceding-sibling, lista de nodos hermanos inferiores en preorden al nodo contexto

  • namespace, lista de nodos con el espacio de nombres del nodo contexto

  • attribute, lista de nodos con atributos del nodo contexto

ejesXPATH
ejesXPATH2

Pruebas

  • Sintaxis:

    • <prueba> ::= <identificador> | node() | text() | * | *@

  • Semántica: se filtra del conjunto de nodos aquellos que cumplan la prueba del nodo por nombre mediante un identificador o tipo mediante node(), text(), …​

    • Abreviaturas:

      • *, equivalente a todos los elementos hijos del nodo contextual

      • @*, equivalente a todos los atributos del nodo contextual

      • //, equivalente a /descendant-or-self/node()/, para absoluto

      • .// equivalente a descendant-or-self/node()/, para relativo

Resultado XPath XPath abreviado
  • todos los nodos país

/child::countries

/countries, //countries

  • todos los nodos capital de cada páis

/child::countries/child::country/ child::capital

//capital

  • todos los nodos lenguajes de cada páis

/child::countries/child::country/ child::languages

//languages

  • todos los textos lenguajes de cada país

/child::countries/child::country/ child::languages/child::text()

//languages/text()

  • todos los atributos arrays de todos los países

/child::countries/child::country/ child::topLevelDomain/attribute::array

//@array

Predicados

  • Sintaxis:

    • <predicado> ::= [ <expresion> ]

    • <expresion> ::= <valor> | <expresion> <operador> <expresion> | <identificador> ( { <expresion> | <rutaAbsoluta> | <rutaRelativa> } )

    • <operador> ::= and | or | = | != | < | < | > | > | + | - | * | div

    • <xpath> ::= <expresion>

  • Semántica: se filtra el conjunto de nodos para aquellos cuya evalaución de la expresión con el nodo contextual para cada …​

    • operadores:

    • Abreviaturas:

      • [n] equivalente a [position() = n]

Función Retorno Descripción

conjunto de nodos

  • Returns the number of the number of items in the selected node set

  • Returns the position of the context node in the selected node set

  • Takes a location path as an argument and returns the number of nodes in that location path

  • Takes an id as an argument and returns the node that has that id

  • Takes a string and substring as arguments. Returns true if the string begins with the substring. Otherwise, returns false

  • Takes a string and substring as arguments. Returns true if the string contains the substring. Otherwise, returns false

  • Takes a string and substring as arguments. Returns the portion of the string to the left of the substring

  • Takes a string and substring as arguments. Returns the portion of the string to the right of the substring

  • Takes a string, start position and length as arguments. Returns the substring of length characters beginning with the character at start position

  • Takes a string as an argument and returns its length

  • Returns the name of an element

  • Returns the text child nodes of an element

  • Takes an object as an argument. Returns true if: the object is a number greater than zero the object is a non-empty node-set the object is a string with at least one character.

  • Takes a node-set as an argument and returns the sum of of the string values of the node-set.

  • Takes a number as an argument and returns the rounded-up value.

  • Takes a number as an argument and returns the rounded-down value.

  • Takes a number as an argument and returns the rounded value.

Resultado XPath
  • el nodo país cuyo nombre sea Spain

//country[name = "Spain"]

  • los textos name de todos los países cuya población supera el millón de personas

//country[population > 1000.0E+6]/name/text()

  • todos los nodos name de los paises fronterizos con España

//country[borders/text() = "ESP"]/name

  • nodo name del país cuyo nativo sea Español

//nativeName[. = "Español"]/../../name

  • todos los nodos name cuya población sea superior al millón de personas

//population[. > 1000.0E+6]/../name

  • todos los nodos name de países fronterizos con España

//borders[. = "ESP"]/../name

  • todos los nodos name de los primeros lenguajes oficiales

//languages[./preceding-sibling::languages]/name

//languages[position() = 1]/name

//languages[1]/name

  • todos los nodos name de países con más de un lenguaje oficial

//country[count(./languages)>1]/name

  • el nodo name del primer idioma oficial del primer país

//languages[count(./preceding::languages)=0]/name

  • todos los nodos country entre zonas horarias de -5 a -3

//country/timezones[-5 ⇐ number(substring-before(substring-after(text(),"UTC"),":")) and number(substring-before(substring-after(text(),"UTC"),":")) ⇐ -3]/../name

  • cantidad de población mundial

sum(//population)

  • cantidad de países supera su población al millón de personas

count(//country[population > 1000.E+6])

  • cantidad de paises con más de un lengauje oficial

count(/countries/country[count(./languages)>1])

  • cantidad de países tienen el Español como lengua oficial

count(/countries/country/languages/nativeName[text() = "Español"])

  • cantidad de media de población

sum(//population) div count(//country)

  • todos los distintos nodos correspondientes a los primeros lenguajes de cada país

distinct-values(//country/languages[1]/./name)

  • todos los nodos name de los paises con población superior a la media

/countries/country[(sum(//population) div count(//country)) < ./population]/name

Sintesis

sintesis

Bibliografía

Obra, Autor y Edición Portada Obra, Autor y Edición Portada

Ponente

  • Luis Fernández Muñoz

setillo

  • Doctor en Inteligencia Artificial por la UPM

  • Ingeniero en Informática por la UMA

  • Diplomado en Informática por la UPM

  • Profesor Titular de ETSISI de la UPM