Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Índice.
Introducción a XML.
Estudiando XML.
DTD’s y Schemas.
Manipulación de XML.
1
¿Qué es XML?.
XML
2
XML vs HTML
<html>
<head>
<title>Hello John</title>
</head>
<body bgcolor="#FFFFFF"
text="#000000">
<p> Hello John. </P>
</body>
</html>
XML vs HTML
<html>
Es el título de la página
<head>
<title>Hello John</title>
</head>
<body bgcolor="#FFFFFF"
text="#000000">
<p> Hello John. </P>
</body>
Es un párrafo
</html>
HTML no es XML !!
3
XML como un árbol
<bib>
<bib>
<libro>
<titulo>TCP/IP Illustrated</titulo>
<autor>
<libro>
<apellido>Stevens</apellido>
<nombre>W.</nombre>
</autor>
<editorial>Addison-Wesley</editorial>
<precio> 65.95</precio> <titulo> <autor> <editorial> <precio>
</libro>
</bib>
<apellido> <nombre>
Estudiando XML
4
XML es un metalenguage
Ojo, XML no es un lenguaje de etiquetas,
sino un conjunto de reglas para definir
lenguajes de etiquetas (como XHTML).
Aplicaciones de XML
5
XML en el mundo real
Frameworks de desarrollo (Struts, Spring,
etc..)
OpenOffice.
Configuración de aplicaciones: Tomcat.
Estándares de contenidos en e-Learning.
Servicios web.
Definición de interfaces gráficas (XUL).
Sistemas de publicación de contenidos.
Bases de datos.
Un ejemplo: RSS
Really Simple Syndication:
Syndication: formato de sindicación de contenidos.
Lenguaje de etiquetas construido a partir de XML.
<rss version="0.92">
<channel>
<title>Dave Winer: Grateful Dead</title>
<link>http://www.scripting.com/blog/categories/gratefulDead.html
</link>
<description>
A high-fidelity Grateful Dead song every day.
</description>
<lastBuildDate>Fri, 13 Apr 2001 19:23:02 GMT</lastBuildDate>
<docs>http://backend.userland.com/rss092</docs>
<managingEditor>dave@userland.com (Dave Winer)</managingEditor>
<webMaster>dave@userland.com (Dave Winer)</webMaster>
<cloud domain="data.ourfavoritesongs.com" port="80" path="/RPC2"
registerProcedure="ourFavoriteSongs.rssPleaseNotify" protocol="xml-rpc"/>
<item>
<description> It's been a few days since I added a song to the Grateful Dead channel.
</description>
<enclosure url="http://www.scripting.com/mp3s/weatherReportDicksPicsVol7.mp3"
length="6182912" type="audio/mpeg"/>
</item>
...
</channel>
</rss>
6
Términos en XML
<direccion>
Etiqueta
<nombre>
<titulo>Mrs.</titulo>
<nombre> Mary </nombre>
Elemento
<apellidos>McGoon</apellidos>
</nombre>
<calle> 1401 Main Street </calle> Atributo
<ciudad estado="NC">Anytown</ciudad>
<!- Lo que ponga aquí es ignorado
por el parser.
Comentario
Include <a> marcas </a>-->
</direccion>
Reglas sintácticas
Una raiz.
Anidación de las etiquetas.
Sensible a mayúsculas.
Atributos no vacíos y entrecomillados.
Reglas para los nombres de etiquetas y
atributos.
7
Caracteres no permitidos
& &
< <
> >
' ‘
" “
Ejercicio
<?xml version="1.0"?> <?xml version="1.0"?>
<X> Hola Mundo! </X> 1 <A> 2
<X> Hola Mundo! </X> <B>
<C> 1 </C>
</B>
<C> 2 </C>
</A>
<?xml version="1.0"?>
<A> 3
<B>
<C> 1 </B>
</C> <?xml version="1.0"?>
<C> 2 </C> <P> 4
</A> <X A=“23” />
<X B=“24” />
</P>
<?xml version="1.0"?>
<A ID=“1”> 5 <?xml version="1.0"?>
<B X=“xyz”> <X> Hola Mundo! </X> 6
<C C=45> 1 </C>
</B>
</A>
8
Un ejercicio
¿Qué similitudes y diferencias existen entre almacenar
información en una BBDD y en XML?.
Nombre Apellidos Calle Ciudad <direccion>
<nombre>
<titulo>Mrs.</titulo>
9
¿Cuándo utilizar etiquetas y
cuándo atributos?
No hay un conjunto de normas claras.
En general, manda la experiencia.
Podemos vivir sin ellos.
Los atributos no tienen orden.
Un ejemplo
<mensajes> <mensajes>
<mensaje> <mensaje tipo="Informativo">
<tipo> Informativo </tipo> Reunión a las 12
<texto> Reunión a las 12 </texto> </mensaje>
</mensaje> <mensaje tipo="Solicitud">
<mensaje> Necesito el informe 9A
<tipo> Solicitud </tipo> </mensaje>
<texto> Informe 9A </texto> </mensajes>
</mensaje>
</mensajes>
10
Aún hay mucho más.
Instrucciones de procesado.
Entidades.
Namespaces.
Caracteres de escape
En resumen
Lenguaje textual.
XML no especifica ninguna etiqueta.
Es estricto.
11
Un ejemplo
IBM
Un ejemplo
IBM
12
Un ejercicio
Queremos guardar información d eun libro:
libro: su título,
título, sus
autores y el año de edición.
edición.
<libro>
<titulo> Libro 1 </titulo>
<autores>
<autor> Uno </autor>
<libro año="1999">
<autor> Dos </autor>
<titulo> Libro 1 </titulo>
</autores> <autores>
<año> 1999 </año> <autor nombre="Uno" />
</libro> ¿Tengo que
<autor nombre="Dos" /> poner siempre, al menos
</autores> un autor, o si no conozco los autores
</libro> lo puedo dejar en blanco?. ¿Y el
<autor>
año?. <autores> Libro 1 </autores>
<titulo>
<libro> Uno </libro>
<libro> Dos </libro>
</titulo>
<año> 1999 </año>
</autor>
Otro ejemplo.
Un juego de texto donde cada habitación tiene un
identificador,
identificador, una descripción y sus salidas.
salidas.
<ROOM ID="2.1"> <HABITACION ID="2.1">
<DESCRIPTION> <DESCRIPCION>
Te encuentras en un habitáculo Te encuentras en un habitáculo
exactamente igual al anterior. En el exactamente igual al anterior. En el
centro de la habitación ves un poste de centro de la habitación ves un poste
color blanco de aproximadamente un metro de color blanco de aproximadamente un
de alto. También ves un pasillo que nace metro de alto. También ves un pasillo
en la pared del fondo. que nace en la pared del fondo.
</DESCRIPTION> </DESCRIPCION>
<EXITS> <SALIDA>
<EXIT ID="NORTH" TO="2.2"/> <DIRECCION> nORTE </DIRECCION>
</EXITS> <HACIA>2.2</HACIA>
</ROOM> </SALIDA>
</HABITACION>
13
Unas notas sobre Namespaces
Tengo una lista de clientes y otras de
empleados y quiero guardar en un
documento XML los clientes y el
empleado que los atiende.
Namespaces
Un namespace es un ámbito de definición
de etiquetas.
Para cada etiqueta hemos de indicar,
además su namespace.
Los namespaces deben declararse antes
de utilizarse.
14
Namespaces. Un ejemplo
DTDs y Schemas.
15
Un juego de etiquetas comunes
1
<cliente>
<nombre> Uno </nombre>
<nombre> Dos </nombre>
</cliente>
<cliente>, <nombre>,
<apellido>, <dirección>
2
<nombre>
<cliente> Uno </cliente>
<cliente> Dos </cliente>
</nombre>
16
Definición de la estructura de un
documento
DTD’s y Schemas.
Para definir la estructura de un documento
utilizamos otro documento.
Ambas sirven para lo mismo.
Estructura.
Que etiquetas pueden aparecer.
Como se combinan esas etiquetas.
DTD en XML.
Schema, su propia especificación
Un ejemplo
<!ELEMENT cliente (persona-contacto,
direccion, ciudad)>
<!ELEMENT persona-contacto (titulo?, nombre,
apellidos)> Documento válido
<!ELEMENT titulo (#PCDATA)>
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT apellidos (#PCDATA)> <cliente>
<!ELEMENT direccion (#PCDATA)> <persona-contacto>
<!ELEMENT ciudad (#PCDATA)> <titulo> Don </titulo>
<nombre> Juan </nombre>
<apellidos> Nadie Nadie </apellidos>
</persona-contacto>
<direccion> X </direccion>
<ciudad> Y </ciudad>
</cliente>
<cliente>
<persona-contacto>
<nombre> Juan </nombre>
<apellidos> Nadie Nadie </apellidos>
</persona-contacto>
<direccion> X </direccion>
<ciudad> Y </ciudad>
</cliente>
17
D.T.D.s
Declaración de tipo de documento.
Declaración de elementos. Nos centraremos
en estas dos.
Declaración de atributos.
Declaracion de notaciones.
Declaración de entidades.
D.T.D.s
Estas líneas nos dan mucha información. Un elemento <cliente> contiene una <persona-
contacto>, una <dirección> y una <ciudad>.
Todos estos elementos deben aparecer y deben
hacerlo en ese mismo orden.
18
<cliente>
<persona-contacto> 2
Ejercicio </persona-contacto>
<ciudad> ciudad </ciudad
<direccion> d </direccion>
</cliente>
<cliente>
<persona-contacto>
<cliente> <nombre> Juan </nombre>
4
<persona-contacto> 1 <apellidos>
<nombre> n </nombre> <primero> X </primero>
<apellidos> p> <segundo> y </segundo>
</persona-contacto> </apellidos>
<direccion> d </direccion> </persona-contacto>
<ciudad> ciudad </ciudad <direccion> d </direccion>
</cliente> <ciudad> ciudad </ciudad
</cliente>
<cliente>
<persona-contacto> 3 <cliente>
<nombre> Juan </nombre> <persona-contacto> 5
<nombre> Pablo </nombre> <nombre> Juan </nombre>
<apellidos> p </apellidos> <apellidos> X </apellidos>
</persona-contacto> <direccion> d </direccion>
<direccion> d </direccion> </persona-contacto>
<ciudad> ciudad </ciudad <ciudad> ciudad </ciudad
</cliente> </cliente>
19
D.T.D.s para atributos.
Si no se indica, el tercer
El elemento a puede tener atributo vale “Valor por
hasta 3 atributos. defecto”.
Ejercicio
Escribir una DTD para el siguiente
documento. <!DOCTYPE LIBROS SYSTEM "libros.dtd">
<LIBROS>
<LIBRO>
<TITULO>AutoSketch</TITULO>
<AUTOR>Ramón Montero</AUTOR>
<PRECIO>2.500</PRECIO>
</LIBRO>
<!ELEMENT LIBROS (LIBRO)+>
<LIBRO>
<!ELEMENT LIBRO <TITULO>Windows 98</TITULO>
(TITULO,AUTOR,PRECIO)>
<AUTOR>Jaime de Yraolagoitia</AUTOR>
<!ELEMENT TITULO<PRECIO>3.250</PRECIO>
(#PCDATA)>
</LIBRO>
<!ELEMENT AUTOR (#PCDATA)>
<LIBRO>
<!ELEMENT PRECIO<TITULO>Web Graphics</TITULO>
(#PCDATA)>
<AUTOR>Ron Wodaski</AUTOR>
<PRECIO>8.975</PRECIO>
</LIBRO>
</LIBROS>
20
Conclusiones sobre las DTDs
La sintaxis DTD es distinta de XML.
Pobre soporte de namespaces.
No permite crear nuevos tipos.
No permiten establecer restricciones
complejas.
Son parte de XML.
Schemas
Son documentos XML.
Soportan tipos de datos.
Soportan namespaces.
Permiten definir nuevos tipos de datos y
restricciones sobre los valores de un
elemento.
Ofrecen mayor precisión que los DTDs.
21
Schemas
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!ELEMENT <xsd:element name="cliente ">
cliente (persona-contacto,
<xsd:complexType>
direccion, ciudad)>
<!ELEMENT <xsd:sequence>
persona-contacto (titulo?, nombre,
<xsd:element
apellidos)> ref="persona-contacto"/>
<!ELEMENT titulo (#PCDATA)> <xsd:element ref="direccion"/>
<!ELEMENT nombre (#PCDATA)> <xsd:element ref="ciudad"/>
<!ELEMENT apellidos (#PCDATA)> </xsd:sequence>
<!ELEMENT direccion (#PCDATA)></xsd:complexType>
<!ELEMENT ciudad (#PCDATA)> </xsd:element>
<xsd:element name="persona-contacto">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="titulo" minOccurs="0"/>
<xsd:element ref="nombre"/>
<xsd:element ref="apellidos"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="titulo" type="xsd:string"/>
<xsd:element name ="nombre" type="xsd:string"/>
<xsd:element name ="apellidos" type="xsd:string"/>
<xsd:element name ="direccion" type="xsd:string"/>
<xsd:element name ="ciudad" type="xsd:string"/>
</xsd:schema>
Schemas
Namespace del Schema.
Este es el namespace
recomendado en la
<?xml version="1.0"?> especificación.
<schema xmlns="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"> Declaración de un
<element name="nombre-y-apellidos">
elemento.
<complexType> Compuesto por una
<sequence> secuencia de otros
<element name="nombre" type="string"/> elementos.
<element name="apellido1" type="string"/>
<element name="apellido2" type="string"/>
</sequence>
<attribute name="sexo" type="string"/>
Con un atributo. Sólo los
</complexType> elementos complejos
</element> tienen atributos.
</schema>
22
Schemas
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<element name="nombre-y-apellidos">
<complexType> Elementos simples que
<sequence> sólo pueden contener
<element name="nombre" type="string"/> texto.
<element name="apellido1" type="string"/>
<element name="apellido2" type="string"/>
</sequence>
<attribute name="sexo" type="string"/>
</complexType>
</element>
</schema>
Schemas
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<element name="nombre-y-apellidos">
<complexType>
<sequence>
<element name="nombre" type="string"/>
<element name="apellido1" type="string"/>
<element name="apellido2" type="string"/>
</sequence>
<attribute name="sexo" type="string"/>
</complexType>
</element>
</schema>
<nombre-y-apellidos sexo="varon">
<nombre> Juan </nombre>
<apellido1> Perez </apellido1>
<apellido2> Perez </apellido2>
</nombre-y-apellidos>
23
Tipos de datos.
string
decimal
integer
positiveInteger <producto id="1345" />
boolean
<xs:element name="producto">
<xs:complexType>
<xs:attribute name="id" type="xs:positiveInteger"/>
</xs:complexType>
</xs:element>
Indicadores.
Indicadores de orden.
All <xs:element name="libro">
<xs:complexType>
Choice <xs:choice>
<xs:element name="autor" type="xs:string"/>
<xs:element name="editor" type="xs:string"/>
Sequence </xs:choice>
</xs:complexType>
</xs:element>
Indicadores de cantidad.
maxOccurs
minOccurs
Ilimitada: maxOccurs="unbounded"
24
Tipos propios
<xs:complexType name="persona">
<xs:sequence>
<xs:element name="nombre" type="xs:string"/>
<xs:element name="apellidos" type="xs:string"/>
</xs:sequence>
</xs:complexType>
...
<xs:element name="empleado" type="persona">
<empleado>
<xs:element name="cliente" type="persona"><nombre> Yo </nombre>
<apellidos> mismo </apellidos>
</empleado>
<cliente>
<nombre> Yo </nombre>
<apellidos> mismo </apellidos>
</cliente>
...
Extensiones de tipos
<persona edad=“36">Juán Pérez</ persona >
<xs:element name=“persona">
<xs:complexType>
<xs:simpleContent>
<xs:extension base=“xs:string">
<xs:attribute name=“edad" type="xs:integer" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
25
Extensiones de tipos
<!-- Elementos comunes -->
Un ejemplo. Dentro de una etiqueta
<xs:complexType name="Tipo-Ficha">
<xs:sequence>
Son
<!-- elementos
Elementos diferentes
propios del libro --> pero comparten
<xs:complexType name="Tipo-Libro">
la<xs:complexContent>
mayoría de la información: autores,
<xs:extension base="Tipo-Ficha">
título, año de edición, resumen, etc...
<xs:sequence>
<xs:element name="ISBN" type="xs:string" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
Restricciones
El elemento edad puede valer
entre 0 y 100
<xs:element name="edad">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="100"/>
</xs:restriction>
</xs:simpleType> El elemento coche sólo puede
</xs:element> ser Audi, Golf o BMW
<xs:element name="coche">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
26
Restricciones
Tres letras
<xs:element name="iniciales">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-zA-Z][a-zA-Z][a-zA-Z]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Un código postal de 5 dígitos
Restricciones
<xs:element name="clave">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="5"/>
<xs:maxLength value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
27
Ejercicios
<empleado>
<persona>
<nombre> Yo </nombre>
<nombre> Yo </nombre>
<apellidos> mismo </apellidos>
<apodo> uno </apodo>
</empleado>
<apodo> dos </apodo>
<id> 12ABc </id>
<apodo> tres </apodo>
Añadir
</ un elemento
persona > <clave> de, exactamente, 8 caracteres
al empleado.
Soluciones
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="empleado">
<xs:complexType>
<xs:sequence>
<xs:element name="nombre" type="xs:string"/>
<xs:element name="apellidos" type="xs:string"/>
<xs:element name=“clave">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence> <xs:element name="foto">
</xs:complexType> <xs:complexType>
<xs:sequence>
</xs:element> <xs:attribute name=“archivo" type="xs:string"/>
</xs:schema> </xs:sequence>
</xs:complexType>
</xs:element>
28
Soluciones
<xs:element name="persona">
<xs:complexType>
<xs:sequence>
<xs:element name="nombre" type="xs:string"/>
<xs:element name="apodo" type="xs:string"
maxOccurs="maxOccurs="unbounded"
minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Ejercicio
<CHESSBOARD> La única pieza
<WHITEPIECES> obligatoria es el rey.
rey.
<KING><POSITION COLUMN="G" ROW="1"/></KING>
<BISHOP><POSITION COLUMN="D" ROW="6"/></BISHOP> El rey y la reina solo
<ROOK><POSITION COLUMN="E" ROW="1"/></ROOK> aparecen una vez,
vez, el
<PAWN><POSITION COLUMN="A" ROW="4"/></PAWN>
resto de las piezas
</WHITEPIECES>
<BLACKPIECES> dos veces salvo el
<KING><POSITION COLUMN="B" ROW="6"/></KING> peón que aparece 8.
<PAWN><POSITION COLUMN="D" ROW="4"/></PAWN>
</BLACKPIECES>
</CHESSBOARD>
29
Solución
<?xml version="1.0" encoding="UTF-8"?>
xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="CHESSBOARD">
<xsd:complexType> <xsd:complexType name="piece">
<xsd:sequence> <xsd:sequence>
<xsd:element name="WHITEPIECES" <xsd:element name="POSITION"
type="pieces" /> minOccurs='1' maxOccurs='1'>
<xsd:element name="BLACKPIECES" <xsd:complexType>
type="pieces" /> <xsd:attribute name="COLUMN" use='required'>
</xsd:sequence> <xsd:simpleType>
</xsd:complexType> <xsd:restriction base="xsd:string">
</xsd:element> <xsd:pattern value="[A-H]"/>
</xsd:restriction>
<xsd:complexType name="pieces"> </xsd:simpleType>
<xsd:sequence> </xsd:attribute>
<xsd:element name="KING" type="piece" <xsd:attribute name="ROW" use='required'>
minOccurs='1' maxOccurs='1'/> <xsd:simpleType>
<xsd:element name="QUEEN" type="piece" <xsd:restriction base="xsd:positiveInteger">
minOccurs='0' maxOccurs='1'/> <xsd:minInclusive value="1"/>
<xsd:element name="BISHOP" type="piece" <xsd:maxInclusive value="8"/>
minOccurs='0' maxOccurs='2'/> </xsd:restriction>
<xsd:element name="ROOK" type="piece" </xsd:simpleType>
minOccurs='0' maxOccurs='2'/> </xsd:attribute>
<xsd:element name="KNIGHT" type="piece" </xsd:complexType>
minOccurs='0' maxOccurs='2'/> </xsd:element>
<xsd:element name="PAWN" type="piece" </xsd:sequence>
minOccurs='0' maxOccurs='8'/> </xsd:complexType>
</xsd:sequence> </xsd:schema>
</xsd:complexType>
¿Existe ya un vocabulario de
etiquetas para mi problema?
Probablemente sí:
http://www.oasis–open.org/cover/xml.html
http://www.dublincore.org
http://www.rosettanet.org
Google.
Aplicaciones similares.
30
Manipulación de XML.
31
Simple API for XML
Comienza el
elemento
<nombre>
<persona>
<nombre> Yo </nombre>
<apodo> uno </apodo>
<apodo> dos </apodo> Programa
<apodo> tres </apodo>
</persona>
Termina el
elemento
<nombre>
32
Simple API for XML. Ventajas
Sencillo.
Consume poca memoria.
33
Un ejemplo
Un ejemplo
import org.xml.sax.*;
<CHESSBOARD>
import org.xml.sax.helpers.*;
<WHITEPIECES>
import javax.xml.parsers.*;
<KING><POSITION COLUMN="G" ROW="1"/></KING>
public class ChessboardSAXPrinter
<BISHOP><POSITION COLUMN="D"{ ROW="6"/></BISHOP>
private SAXParser parser;
<ROOK><POSITION COLUMN="E" ROW="1"/></ROOK>
<PAWN><POSITION
public COLUMN="A"
class ChessboardHandler ROW="4"/></PAWN>
extends HandlerBase {
</WHITEPIECES>
private boolean whitePiece = false;
<BLACKPIECES>
public void startElement(String name,
AttributeList attrs)
<KING><POSITION {
COLUMN="B" ROW="6"/></KING>
if (name.equals("WHITEPIECES"))
<PAWN><POSITION {
COLUMN="D" ROW="4"/></PAWN>
whitePiece = true;
</BLACKPIECES>
} else if (name.equals("BLACKPIECES")) {
</CHESSBOARD>
whitePiece = false;
} else if (name.equals("KING") || name.equals("QUEEN") || name.equals("BISHOP") ||
name.equals("ROOK")
|| name.equals("KNIGHT") || name.equals("PAWN")) {
System.out.print((whitePiece ? "White" : "Black") + " "+ name.toLowerCase() + ": ");
} else if (name.equals("POSITION")) {
if (attrs != null) {
System.out.print(attrs.getValue("COLUMN"));
System.out.println(attrs.getValue("ROW"));
}
}
return;
}
}
}
34
Document Object Model
<bib>
<libro>
<titulo>TCP/IP Illustrated</titulo>
<autor>
<apellido>Stevens</apellido>
<nombre>W.</nombre>
</autor> <bib>
<editorial>Addison-Wesley</editorial>
<precio> 65.95</precio>
</libro>
</bib>
<libro>
<apellido> <nombre>
35
Document Object Model. Ventajas
Más rápido.
Ofrece una interfaz para recorrer el árbol
36
Un ejemplo
public void print(String fileName)
throws SAXException, IOException {
NodeList positions
= document.getElementsByTagName("POSITION");
for (int i = 0; i < positions.getLength(); i++) {
Element position = (Element) positions.item(i);
Element piece = (Element) position.getParentNode();
Element pieces = (Element) piece.getParentNode();
out.println(
(pieces.getTagName().equals("WHITEPIECES")
? "White " : "Black ")
+ piece.getTagName().toLowerCase() + ": "
+ position.getAttribute("COLUMN")
+ position.getAttribute("ROW"));
}
return;
}
Conclusiones
SAX es útil cuando tenemos limitaciones
de memoria o para desarrollar
rápidamente con documentos sencillos.
DOM ofrece el máximo control y
flexibilidad.
Son herramientas básicas.
En Java: SUN o Xerces (xml.apache.org).
37
Otras APIs
Implementaciones propias de cada
lenguaje.
En Java:
JDom (http://www.jdom.org).
Dom4J (http://www.dom4j.org).
XOM (http://www.cafeconleche.org/XOM/).
Una comparativa:
http://www.dom4j.org/compare.html
XML Binding
¿Qué es?.
Vincular un conjunto de clases con un
conjunto de estructuras XML.
Crear objetos a partir del contenido de las
estructuras.
Y viceversa.
38
XML Binding
Tres elementos
característicos.
Generación de clases.
clases.
Marshalling /
unmarchalling.
unmarchalling.
Vinculación de
Schemas.
XML Binding
Herramientas (en java).
JAXB http://java.sun.com/xml/jaxb/
Castor http://castor.exolab.org
XMLBeans http://xmlbeans.apache.org
http://xmlbeans.apache.org//
La mejor: http://www.manageability.org/polls/tool-
http://www.manageability.org/polls/tool-for-
for-xml-
xml-binding
39
XMLBinding. Herramientas.
Castor http://www.castor.org/
Xgen http://www.commerceone.com/developers/docso
apxdk
Breeze http://www.breezefactor.com/
Zeus http://zeus.objectweb.org/
XMLBeans http://xml.apache.org/xmlbeans/
Un ejemplo.
<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns="Faenor.Global"
targetNamespace="Faenor.Global"
xmlns:xml="http://www.w3.org/XML/1998/namespace"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="GLOBAL">
<xs:complexType>
<xs:all>
<xs:element name="ROOM" type="xs:string"/>
<xs:element name="WHOAMI" type="xs:string"/>
<xs:element name="INTRO" type="xs:string"/>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema> <?xml version="1.0" encoding="ISO-8859-1"?>
<GLOBAL xmlns="Faenor.Global"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.imsproject.org/xsd/imscp_rootv1p1p2
http://www.imsproject.org/xsd/imscp_rootv1p1p2.xsd
http://www.imsproject.org/xsd/ims_md_rootv1p1
http://www.imsproject.org/xsd/ims_md_rootv1p1.xsd">
<ROOM>1</ROOM>
<WHOAMI> Eres Korbe, el joven hijo de unos granjeros.
</WHOAMI>
<INTRO> Has elegido un magnifico día soleado de primavera para
emprender tu camino. </INTRO>
</GLOBAL>
40
Un ejemplo. //// This file was generated by the JavaTM Architecture for XML
Binding(JAXB) Reference Implementation, v1.0 package
Adventure.XMLData.Global.impl;
//….
Un ejemplo
Global obj;
// 1
JAXBContext jc = JAXBContext.newInstance("Adventure.XMLData.Global");
// 2
Unmarshaller u = jc.createUnmarshaller();
// 3
obj = (Global)u.unmarshal(new FileInputStream(path+name+".xml"));
41
XML Binding. Consejos.
Aplicarlo siempre que tengamos un
Schema bien definido que no vaya a
cambiar.
Cuando solo necesitemos los datos del
XML.
Cuando el código generado nos sirve.
Puede presentar los mismos problemas
que DOM.
Serializadores
Hay quien los incluye dentro de las
herramientas de Binding.
Su objetivo es el mismo pero sin vínculos
con Schemas.
No generan el código.
Son más rápidos de aplicar pero menos
potentes.
42
Serializadores
XStream http://xstream.codehaus.org
http://xstream.codehaus.org//
Betwixt http://jakarta.apache.org
http://jakarta.apache.org/commons/betwixt/
/commons/betwixt/
Un ejemplo
<person> public class Person {
<firstname>Joe</firstname> private String firstname;
<lastname>Walnes</lastname> private String lastname;
<phone> private PhoneNumber phone;
<code>123</code> private PhoneNumber fax;
<number>1234-456</number> // ...
</phone> }
<fax>
<code>123</code> public class PhoneNumber {
<number>9999-999</number> private int code;
</fax> private String number;
</person> // ...
}
43
eXtensible Stylesheet Language
Familia de recomendaciones para la
definición de transformaciones y
presentaciones de documentos XML.
XSLT. Transformaciones.
XPath. Lenguage de expresiones.
XSL-FO. Presentaciones.
44
Un ejemplo
<source>
<title>XSL</title>
<author>Alan</author>
</source>
<h1>XSL</h1>
<h2>John Smith</h2>
Aplicaciones
Generar páginas web.
Convertir unas estructuras XML en otras
(compatibilidad).
Crear PDFs.
Crear código.
45
Plantillas
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match="bold">
<p> <b> Se aplica sobre el elemento <bold>
<xsl:value-of select="."/>
</b> </p> Escribe el valor de este elemento.
</xsl:template>
</xsl:stylesheet>
<p>
<bold> Frase </bold> <b> Frase </b>
<p>
Plantillas
</xsl:stylesheet>
46
XPath
Lenguaje de expresión utilizado para
referenciar nodos de información en un
conjunto de datos XML.
También es un estándar del W3C.
Similar a expresiones regulares para
nodos XML.
XPath. Ejemplos.
/html/
html/body/h1
body/h1 Selecciona todos los nodos <h1> que son hijos de un nodo
<body>
body> que, a su vez, es hijo de un nodo <html
<html>
> que es el nodo
raíz
//h1 Selecciona todos los nodos <h1> que aparezcan en cualquier
posición del árbol XML. La doble barra indica cualquier
profundidad.
count(//libro)
count(//libro) Devuelve el número de nodos <libro>
libro> que aparecen en el
documento en cualquier posición.
posición.
//libro[autor
//libro[autor = "Hunter
"Hunter"]
"] Devuelve todos los nodos <libro>
libro> que aparezcan en el
documento en cualquier posición y que tengan un nodo hijo
<autor>
autor> con el valor "Hunter". Los corchetes indican un filtro para
seleccionar los resultados que cumplan una determinada
condición.
condición.
//libro[@año
//libro[@año > 1999] Devuelve todos los nodos <libro>
libro> que tengan un atributo "año"
año"
con un valor superior a 1999. La arroba indica que "año"
año" no es
un hijo (una etiqueta)
etiqueta) sino un atributo de la etiqueta libro.
libro.
(i | b) Devuelve todos los nodos <i> o todos los nodos <b> que
encuentre en el nodo contexto. Por defecto el nodo contexto es
el nodo raíz del documento.
47
XPath. Ejemplos.
doc("
doc("libros.xml
libros.xml")/
")/bib
bib/lib
/lib La expresión anterior devuelve solo el primero nodo autor que
ro/autor[1] encuentre para cada nodo libro.
libro.
//key
//key[.
[. = "Tiempo total"] Devuelve todos los nodos <key> que tengan un valor de
"Tiempo total.". El carácter "." representa el nodo contexto,
contexto, lo
cual tiene una función similar al operador "this" en lenguajes
como C++ o Java.
(//key
(//key)[1]/texto
)[1]/texto Devuelve los nodos <texto> del primer nodo <key
<key>
> del
documento.
Ejercicio.
<bib>
<libro año="1994">
<titulo>TCP/IP Illustrated</titulo>
<autor>
<apellido>Stevens</apellido>
<nombre>W.</nombre>
</autor>
<editorial>Addison-Wesley</editorial>
<precio> 65.95</precio>
</libro>
<libro año="1992">
<titulo>Advan Programming for Unix environment</titulo>
<autor>
<apellido>Stevens</apellido>
<nombre>W.</nombre>
</autor>
<editorial>Addison-Wesley</editorial>
<precio>65.95</precio>
</libro>
....
</bib>
48
XQuery
Una evolución de XPath.
Podemos considerar a XQuery como el
SQL para XML.
D a to s X M L
< b ib >
XQuery. < titu lo > < a u to r> < e d ito ria l> < p re c io >
For y Let C re a n la s tu p la s
W h e re F iltra la s tu p la s
O rd e r b y O rd e n a la s tu p la s
R e tu rn T ra n fo rm a la s tu p la s
R e su ltad o X M L
< b ib >
< titu lo > < a u to r> < e d ito ria l> < p re c io >
49
XQuery
Tres aplicaciones principales.
Recuperar datos de docuemntos XML.
Transformar unas estructuras en otras.
Transformaciones XML->XHTML.
Ejemplo
for $b in doc("libros.xml")//libro
where $b/@año = "2000"
return $b/titulo
Order by No
50
Ejemplo
for $b in doc("libros.xml")//libro Esta consulta devuelve el título de cada
let $c := $b/autor uno de los libros de archivo "libros.xml“
return junto con el número de autores de
<libro>{ $b/titulo, cada libro
<autores>{ count($c) }</autores>}
</libro>
<libro>
<titulo>TCP/IP Illustrated</titulo>
<autores>1</autores>
</libro>
<libro>
<titulo>Advanced Programming in the UNIX Environment</titulo>
<autores>1</autores>
</libro>
Ejemplo
<html> <head> <title> </title>
<body> <table>
{
for $b in doc("libros.xml")/bib/libro
<libro año="1994"> return
<titulo>TCP/IP Illustrated</titulo> <tr> <td> <I> { string( $b/titulo ) }
<autor> </I> </td> </tr>
<apellido>Stevens</apellido> }
</table> </body>
<nombre>W.</nombre> </head> </html>
</autor>
<editorial>Addison-Wesley</editorial>
<precio> 65.95</precio>
</libro>
<html><head><title> </title>
<libro año="1992"> <body>
<titulo>Programming for Unix env.</titulo> <table>
<autor> <tr><td><I>TCP/IP Illustrated</I></td></tr>
<tr><td><I>Advan Programming for Unix environment</I></td></tr>
<apellido>Stevens</apellido> <tr><td><I>Data on the Web</I></td></tr>
<nombre>W.</nombre> <tr><td><I>Economics of Technology for Digital TV</I></td></tr>
</autor> </table>
<editorial>Addison-Wesley</editorial> </body>
<precio>65.95</precio> </head></html>
</libro>
51
XQuery. Enlaces.
XML Query Use Cases.
http://www.w3.org/TR/xmlquery-use-cases
XQuery 1.0: An XML Query Language.
http://www.w3.org/TR/XQuery/
XML Path Language (XPath) 2.0.
http://www.w3.org/TR/xpath20/
XQuery. Herramientas.
XQEngine.
http://xqengine.sourceforge.net/
BumbleBee.
http://www.XQuery.com/bumblebee/
Qexo.
http://www.gnu.org/software/qexo/
Qizx/open.
http://www.xfra.net/qizxopen/
Saxon.
http://saxon.sourceforge.net/
52
Un ejemplo de código
import com.fatdog.xmlEngine.ResultList;
import com.fatdog.xmlEngine.XQEngine;
import com.fatdog.xmlEngine.exceptions.*;
import javax.xml.parsers.*;
import org.xml.sax.XMLReader;
Otros
Existen muchas m´s herramientas para
trabajar con XML.
Jakarta commons XML-IO.
Jakarta commons Digester.
Etc…
53