9. XML: Objetivos
Describir contenido, no presentación
Nuevos tags
Estructuras anidadas
Documentos autodescriptivos
Representación textual de los datos
Para almacenamiento, trasmisión
“Internacionalizable”
Legible
9
10. Puntos fundamentales
XML
Información estructurada en un archivo.
XML es texto plano, internacionalizable.
XML es modular
Crear aplicaciones cuando se necesiten
XML es un formato no propietario
10
11. NO son objetivos ...
No es fácil de editar “a mano”
No está comprimido
La compresión debe ser provista
externamente
Ejemplo: cierre de elemento es explícito,
pero como es un árbol, podría no serlo.
No es directamente compatible con
HTML
XHTML es una aplicación XML.
11
12. Texto y Árbol
Un documento corresponde a un árbol
A
<?xml version=”1.0”?>
<agenda>
<persona>
P
P
<nombre>Juan</nombre>
<fono>123</fono>
</persona>
<persona>
<nombre>Pedro</nombre> F
N
F
N
<fono>234</fono>
</persona>
</agenda>
P 2
J 1
12
14. Sintaxis atributos
Atributos usan comillas “dobles”
<e a1=”v1” a2=”v2” .. an=”vn”>
...
</e>
a1 .. an son identificadores no repetidos,
cuyo orden NO ES conservado.
Identificador es una secuencia de letras,
números o '-', que comienza con una letra,
de largo > 1
v1 .. vn son texto
14
21. Parsing SAX
SAXparse( start, end, text )
Se provee de apuntadores a funciones
Start( nombre_del_tag )
Ejecutado cada vez que se ve un tag
End()
Cada vez que se ve un tag de cierre
Text( buffer )
Cada vez que se lee texto
21
23. Parsing DOM
doc = DOMParse( “archivo.xml”)
Se lee un árbol completo en memoria
Se pueden buscar nodos
Node = doc.getElementById()
doc.getChild(), etc...
Las funciones se llaman igual en varios
lenguajes: Java, Perl, Python, C++,
etc...
23
24. Ejemplo de DOM en Java
Extraer primer nodo “recipe” (receta) en un documento XML
public static void main(String[] args) {
DOMParser p = new DOMParser();
p.parse(args[0]);
Document doc = p.getDocument();
Node n = doc.getDocumentElement().getFirstChild();
while (n!=null &&
!n.getNodeName().equals(quot;recipequot;))
{
n = n.getNextSibling();
}
PrintStream out = System.out;
out.println(quot;<?xml version=quot;1.0quot;?>quot;);
out.println(quot;<collection>quot;);
if (n!=null)
print(n, out);
out.println(quot;</collection>quot;);
}
24
31. Ejemplo simple DTD 1
ejemplo.dtd ok1.xml
<!ELEMENT ejemplo <!DOCTYPE ejemplo
(#PCDATA)> SYSTEM ejemplo.dtd>
<ejemplo>
Este es un ejemplo.
</ejemplo>
ok2.xml
<!DOCTYPE ejemplo
SYSTEM ejemplo.dtd>
<ejemplo/>
31
32. Ejemplo simple DTD 2
ejemplo.dtd
<!ELEMENT ejemplo
(#PCDATA)>
malo1.xml malo2.xml
<!DOCTYPE ejemplo <!DOCTYPE ejemplo
SYSTEM ejemplo.dtd> SYSTEM ejemplo.dtd>
<inicioejemplo> <example>
Este es un ejemplo. Este es un ejemplo.
</finejemplo> </example>
(NO ESTA BIEN FORMADO) (NO ES VÁLIDO)
32
33. ¿Qué describe una DTD?
Elementos
Cuales son los tags permitidos
Cual es el contenido de cada tag
Estructura
En que orden van los tags en el documento
Anidamiento
Cuales tags van dentro de cuales
33
34. Contenido ELEMENT
Un elemento tiene
ejemplo.dtd
contenido
<!ELEMENT mensaje
(urgente?, asunto,
ELEMENT, si solo
cuerpo)>
puede contener a
<!ELEMENT asunto
(#PCDATA)>
otros elementos,
<!ELEMENT cuerpo
(#PCDATA|cita)*>
opcionalmente
<!ELEMENT cita
(#PCDATA)>
separados por
<!ELEMENT urgente
espacios en
EMPTY>
blanco.
34
35. Contenido TEXT
Un elemento tiene
ejemplo.dtd
contenido TEXT, si
<!ELEMENT mensaje
(urgente?, asunto,
solo puede
cuerpo)>
contener texto
<!ELEMENT asunto
(#PCDATA)>
<!ELEMENT cuerpo
(PCDATA = printable
(#PCDATA|cita)*>
<!ELEMENT cita
character data)
(#PCDATA)>
<!ELEMENT urgente
EMPTY>
35
36. Contenido MIXED
Un elemento tiene
ejemplo.dtd
contenido MIXED,
<!ELEMENT mensaje
(urgente?, asunto,
si puede contener
cuerpo)>
texto u otros
<!ELEMENT asunto
(#PCDATA)>
elementos
<!ELEMENT cuerpo
(#PCDATA|cita)*>
<!ELEMENT cita
(#PCDATA)>
<!ELEMENT urgente
EMPTY>
Nota: #PCDATA debe
aparecer primero en la lista
ej.: “(#PCDATA|cita)”
36
37. Contenido EMPTY
Un elemento tiene
ejemplo.dtd
contenido EMPTY,
<!ELEMENT mensaje
(urgente?, asunto,
si no puede
cuerpo)>
contener otros
<!ELEMENT asunto
(#PCDATA)>
elementos
<!ELEMENT cuerpo
(#PCDATA|cita)*>
<!ELEMENT cita
(#PCDATA)>
<!ELEMENT urgente
EMPTY>
37
38. Ejemplos documentos 1/4
ejemplo.dtd ok1.xml
<!ELEMENT mensaje <?xml version=”1.0”?>
(urgente?, asunto, <!DOCTYPE mensaje
cuerpo)> SYSTEM “asunto.dtd”>
<!ELEMENT asunto <mensaje>
(#PCDATA)> <urgente/>
<!ELEMENT cuerpo <asunto>
(#PCDATA|cita)*> Agenda del curso
<!ELEMENT cita </asunto>
(#PCDATA)> <cuerpo>
<!ELEMENT urgente <cita>
EMPTY> Por favor enviar agenda
</cita>
Te envio la agenda ahora
</cuerpo>
</mensaje>
38
39. Ejemplos documentos 2/4
ejemplo.dtd ok2.xml
<!ELEMENT mensaje <?xml version=”1.0”?>
(urgente?, asunto, <!DOCTYPE mensaje
cuerpo)> SYSTEM “asunto.dtd”>
<!ELEMENT asunto <mensaje>
(#PCDATA)> <asunto>
<!ELEMENT cuerpo Agenda del curso
(#PCDATA|cita)*> </asunto>
<!ELEMENT cita <cuerpo>
(#PCDATA)> Te envio la agenda ahora
<!ELEMENT urgente </cuerpo>
EMPTY> </mensaje>
39
41. Ejemplos documentos 4/4
ejemplo.dtd malo2.xml
<!ELEMENT mensaje <?xml version=”1.0”?>
(urgente?, asunto, <!DOCTYPE mensaje
cuerpo)> SYSTEM “asunto.dtd”>
<!ELEMENT asunto <mensaje>
(#PCDATA)> <cuerpo>
<!ELEMENT cuerpo Te envio la agenda ahora
(#PCDATA|cita)*> </cuerpo>
<!ELEMENT cita <asunto>Test</asunto>
(#PCDATA)> </mensaje>
<!ELEMENT urgente
EMPTY>
41
42. Orden e inclusion de
elementos
ejemplo.dtd
<! Uno o varios FirstName seguidos de
uno o varios LastName >
<!ELEMENT nombre (FirstName+, LastName+)>
<! Cero o varios FirstName seguidos de
uno o varios LastName >
<!ELEMENT nombre (FirstName*, LastName+)>
<! cheque O BIEN efectivo O BIEN tarjeta >
<!ELEMENT pago (cheque|efectivo|tarjeta)>
<! Carta con o sin fecha >
<!ELEMENT carta (fecha?, cuerpo)>
42
43. Orden de elementos, ejemplo
msj.dtd ok.xml
<!ELEMENT mensaje <?xml version=”1.0”?>
(urgente?|asunto|cuerpo)> <!DOCTYPE mensaje
<!ELEMENT asunto SYSTEM “msj.dtd”>
(#PCDATA)> <mensaje>
<!ELEMENT cuerpo <cuerpo/>
(#PCDATA|cita)*> <asunto/>
<!ELEMENT cita </mensaje>
(#PCDATA)>
<!ELEMENT urgente
EMPTY>
43
44. Atributos
CDATA:
lavadora.dtd
<!ELEMENT lavadora EMPTY>
texto
<!ATTLIST lavadora
carga NMTOKEN #IMPLIED
NMTOKEN:
marca CDATA #IMPLIED
voltaje NMTOKENS
“abc...z0123..9-_:.”
#REQUIRED>
<! #IMPLIED=opcional >
NMTOKENS:
NMTOKEN +
espacios
ID: empezar con letra
IDREF: ser un ID
44
46. Repetición de elementos
biblioteca1.dtd biblioteca2.dtd
<!ELEMENT bib <!ELEMENT bib
(libro|revista)+> (libro|revista)+>
<!ELEMENT libro <!ENTITY % bibelem
(titulo,autor)> “titulo,autor”>
<!ELEMENT revista <!ELEMENT libro
(titulo,autor)> (%bibelem;) >
<!ELEMENT titulo <!ELEMENT revista
(#PCDATA)> (%bibelem;) >
<!ELEMENT autor <!ELEMENT titulo
(#PCDATA)> (#PCDATA)>
<!ELEMENT autor
(#PCDATA)>
46
47. Repetición de atributos
biblioteca1.dtd biblioteca2.dtd
<!ELEMENT bib
<!ELEMENT bib
(libro|revista)+>
(libro|revista)+>
<!ENTITY % bibattrs
<!ELEMENT libro EMPTY>
“titulo CDATA #REQUIRED
<!ATTLIST libro
editorial CDATA #REQUIRED“
titulo CDATA #REQUIRED
>
editorial CDATA #REQUIRED
<!ELEMENT libro EMPTY>
autor CDATA #REQUIRED>
<!ATTLIST libro
<!ATTLIST revista
%bibattrs;
titulo CDATA #REQUIRED
autor CDATA #REQUIRED>
editorial CDATA #REQUIRED
<!ELEMENT revista EMPTY>
numero NMTOKEN #REQUIRED>
<!ATTLIST revista
%bibattrs;
numero CDATA #REQUIRED>
47
48. Resumen
XML = Texto estructurado
DTD = Descripción de estructura
Validar XML usando DTD
48