bases de datos - parte 9/10 xml
TRANSCRIPT
1
Sistemas de Información II
Tema 9. Procesamiento de texto XML
Carlos Castillo
UPF – 2007
2
Agenda
XML como texto estructurado
Procesamiento de XML
Validación de XML con DTDs
3
XMLTexto Estructurado
4
5
HTMLLenguaje usado para escribir páginas Web
Inicialmente
Estructura
Actualmente
Presentación
6
Código HTMLDescribe tamaño, posición, etc...
7
HTML y datosDifícil extraer el texto importante
8
Pérdida de información
<h1>Gente</h1>
<dl><dt>Perez</dt><dd>12345 – Calle 111</dd><dt>González</dt><dd>67889 – Calle 222</ddd></dl>
Página HTML
Despliegue Extracción
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
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
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.
12
Texto y Árbol
Un documento corresponde a un árbol
<?xml version=”1.0”?>
<agenda> <persona> <nombre>Juan</nombre> <fono>123</fono> </persona> <persona> <nombre>Pedro</nombre> <fono>234</fono> </persona></agenda>
A
P P
N F N F
J 1 P 2
13
Sintaxis elementos
<persona>
Tag inicial
</persona>
Tag final
“Juan”
Nodo textual
<persona/>
Nodo vacío
14
Sintaxis atributosAtributos 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
15
Ejemplo uso de atributos (1)
<menu>
<menuitem portion="250 ml">
<name>Small soft drink</name>
</menuitem>
<menuitem portion="500 g">
<name>Sirloin steak</name>
</menuitem>
</menu>
16
Ejemplo uso de atributos (2)
<menu>
<menuitem portionsize="250”
portionunit=”ml">
<name>...</name> </menuitem>
<menuitem portionsize=”500”
portionunit="g">
<name>...</name> </menuitem>
</menu>
17
Ejemplo uso de atributos (3)
<menu>
<menuitem>
<portion unit=”ml”>250</portion>
<name>...</name> </menuitem>
<menuitem>
<portion unit=”g”>500</portion>
<name>...</name> </menuitem>
</menu>
18
Sutilezas (newlines)<tag>\n<tag a=”1”\nb=”2”>\nTexto\nTexto\n</tag><tag>Texto</tag>\n</tag>
<tag>\n<tag a=”1”\nb=”2”>\nTexto\nTexto\n</tag><tag>Texto</tag>\n</tag>
<tag><tag a=”1”b=”2”>Texto\nTexto</tag><tag>Texto</tag></tag>
19
XML Contenido
20
Procesamiento de XML
Orientado a eventos
SAX – Simple API for XML
Más rápido
Orientado a estructura
DOM
Más usable
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
22
Ejemplo de parsing en SAX
saxParse(“...”,start,text,end) text("Hola") start("b") text("mundo") end("b") end("p")
<p>Hola <b>mundo</b></p>
23
Parsing DOM
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...
doc = DOMParse( “archivo.xml”)
24
Ejemplo de DOM en Java
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("recipe")) { n = n.getNextSibling(); } PrintStream out = System.out; out.println("<?xml version=\"1.0\"?>"); out.println("<collection>"); if (n!=null) print(n, out); out.println("</collection>"); }
Extraer primer nodo “recipe” (receta) en un documento XML
25
Validación de XML
26
Diferentes aplicaciones de XML
<?xml version=”1.0”?><pacientes> <paciente> <nombre>Juan</nombre> <apellido>Perez</apellido> <edad>38</edad> </paciente>...</pacientes>
doc1.xml<?xml version=”1.0”?><lavadoras> <lavadora> <marca>Samsung</marca> <modelo>RX1200</modelo> </lavadora>...</lavadoras>
doc2.xml
personas.dtd
productos.dtd
27
Documento XML bien formado
Se dice que un documento XML está bien formado si es sintácticamente correcto.
28
Documento XML válido
Se dice que un documento XML es válido si está de acuerdo con una cierta
especificación de tipo de dato.
29
Procesamiento
doc.xml
Parsing
Validación
... procesamiento
tipo.dtd
30
¿Para qué sirven las DTD?
Describir un formato de datos
Usar un formato común de datos
Verificar los datos al intercambiarlos
Mantener la consistencia
31
Ejemplo simple DTD 1
<!ELEMENT ejemplo (#PCDATA)>
<!DOCTYPE ejemplo SYSTEM ejemplo.dtd><ejemplo> Este es un ejemplo.</ejemplo>
ok1.xmlejemplo.dtd
<!DOCTYPE ejemplo SYSTEM ejemplo.dtd><ejemplo/>
ok2.xml
32
Ejemplo simple DTD 2
<!ELEMENT ejemplo (#PCDATA)>
<!DOCTYPE ejemplo SYSTEM ejemplo.dtd><inicioejemplo> Este es un ejemplo.</finejemplo>
(NO ESTA BIEN FORMADO)
malo1.xml
ejemplo.dtd
<!DOCTYPE ejemplo SYSTEM ejemplo.dtd><example> Este es un ejemplo.</example>
(NO ES VÁLIDO)
malo2.xml
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
34
Contenido ELEMENT
<!ELEMENT mensaje (urgente?, asunto, cuerpo)><!ELEMENT asunto (#PCDATA)><!ELEMENT cuerpo (#PCDATA|cita)*><!ELEMENT cita (#PCDATA)><!ELEMENT urgente EMPTY>
ejemplo.dtd Un elemento tiene contenido ELEMENT, si solo puede contener a otros elementos, opcionalmente separados por espacios en blanco.
35
Contenido TEXT
<!ELEMENT mensaje (urgente?, asunto, cuerpo)><!ELEMENT asunto (#PCDATA)><!ELEMENT cuerpo (#PCDATA|cita)*><!ELEMENT cita (#PCDATA)><!ELEMENT urgente EMPTY>
ejemplo.dtd Un elemento tiene contenido TEXT, si solo puede contener texto
(PCDATA = printable character data)
36
Contenido MIXED
<!ELEMENT mensaje (urgente?, asunto, cuerpo)><!ELEMENT asunto (#PCDATA)><!ELEMENT cuerpo (#PCDATA|cita)*><!ELEMENT cita (#PCDATA)><!ELEMENT urgente EMPTY>
ejemplo.dtd Un elemento tiene contenido MIXED, si puede contener texto u otros elementos
Nota: #PCDATA debe aparecer primero en la lista ej.: “(#PCDATA|cita)”
37
Contenido EMPTY
<!ELEMENT mensaje (urgente?, asunto, cuerpo)><!ELEMENT asunto (#PCDATA)><!ELEMENT cuerpo (#PCDATA|cita)*><!ELEMENT cita (#PCDATA)><!ELEMENT urgente EMPTY>
ejemplo.dtd Un elemento tiene contenido EMPTY, si no puede contener otros elementos
38
Ejemplos documentos 1/4
<!ELEMENT mensaje (urgente?, asunto, cuerpo)><!ELEMENT asunto (#PCDATA)><!ELEMENT cuerpo (#PCDATA|cita)*><!ELEMENT cita (#PCDATA)><!ELEMENT urgente EMPTY>
ejemplo.dtd<?xml version=”1.0”?><!DOCTYPE mensaje SYSTEM “asunto.dtd”><mensaje> <urgente/> <asunto> Agenda del curso </asunto> <cuerpo> <cita> Por favor enviar agenda </cita> Te envio la agenda ahora </cuerpo></mensaje>
ok1.xml
39
Ejemplos documentos 2/4
<!ELEMENT mensaje (urgente?, asunto, cuerpo)><!ELEMENT asunto (#PCDATA)><!ELEMENT cuerpo (#PCDATA|cita)*><!ELEMENT cita (#PCDATA)><!ELEMENT urgente EMPTY>
ejemplo.dtd<?xml version=”1.0”?><!DOCTYPE mensaje SYSTEM “asunto.dtd”><mensaje> <asunto> Agenda del curso </asunto> <cuerpo> Te envio la agenda ahora </cuerpo></mensaje>
ok2.xml
40
Ejemplos documentos 3/4
<!ELEMENT mensaje (urgente?, asunto, cuerpo)><!ELEMENT asunto (#PCDATA)><!ELEMENT cuerpo (#PCDATA|cita)*><!ELEMENT cita (#PCDATA)><!ELEMENT urgente EMPTY>
ejemplo.dtd<?xml version=”1.0”?><!DOCTYPE mensaje SYSTEM “asunto.dtd”><mensaje> <urgente>Si</urgente> <asunto/> <cita>Enviar</cita> <cuerpo> Te envio la agenda ahora </cuerpo></mensaje>
malo1.xml
41
Ejemplos documentos 4/4
<!ELEMENT mensaje (urgente?, asunto, cuerpo)><!ELEMENT asunto (#PCDATA)><!ELEMENT cuerpo (#PCDATA|cita)*><!ELEMENT cita (#PCDATA)><!ELEMENT urgente EMPTY>
ejemplo.dtd<?xml version=”1.0”?><!DOCTYPE mensaje SYSTEM “asunto.dtd”><mensaje> <cuerpo> Te envio la agenda ahora </cuerpo> <asunto>Test</asunto></mensaje>
malo2.xml
42
Orden e inclusion de elementos
<! 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)>
ejemplo.dtd
43
Orden de elementos, ejemplo
<!ELEMENT mensaje (urgente?|asunto|cuerpo)><!ELEMENT asunto (#PCDATA)><!ELEMENT cuerpo (#PCDATA|cita)*><!ELEMENT cita (#PCDATA)><!ELEMENT urgente EMPTY>
msj.dtd<?xml version=”1.0”?><!DOCTYPE mensaje SYSTEM “msj.dtd”><mensaje> <cuerpo/> <asunto/></mensaje>
ok.xml
44
Atributos
<!ELEMENT lavadora EMPTY><!ATTLIST lavadora carga NMTOKEN #IMPLIED marca CDATA #IMPLIED voltaje NMTOKENS #REQUIRED>
<! #IMPLIED=opcional >
lavadora.dtd CDATA:
texto
NMTOKEN:
“abc...z0123..9-_:.”
NMTOKENS:
NMTOKEN + espacios
ID: empezar con letra
IDREF: ser un ID
45
Atributos, ejemplo
<!ELEMENT lavadora EMPTY><!ATTLIST lavadora carga NMTOKEN #IMPLIED marca CDATA #IMPLIED voltaje NMTOKENS #REQUIRED>
lavadora.dtd<?xml version=”1.0”?><!DOCTYPE lavadora SYSTEM “lavadora.dtd”><lavadora carga=”frontal” marca=”Samsung 10XE” voltaje=”210V 110V”/>
lavadora.xml
46
Repetición de elementos
<!ELEMENT bib (libro|revista)+><!ELEMENT libro (titulo,autor)><!ELEMENT revista (titulo,autor)><!ELEMENT titulo (#PCDATA)><!ELEMENT autor (#PCDATA)>
biblioteca1.dtd<!ELEMENT bib (libro|revista)+><!ENTITY % bibelem “titulo,autor”><!ELEMENT libro (%bibelem;) ><!ELEMENT revista (%bibelem;) ><!ELEMENT titulo (#PCDATA)><!ELEMENT autor (#PCDATA)>
biblioteca2.dtd
47
Repetición de atributos
<!ELEMENT bib (libro|revista)+><!ELEMENT libro EMPTY><!ATTLIST libro titulo CDATA #REQUIRED editorial CDATA #REQUIRED autor CDATA #REQUIRED><!ATTLIST revista titulo CDATA #REQUIRED editorial CDATA #REQUIRED numero NMTOKEN #REQUIRED>
biblioteca1.dtd<!ELEMENT bib (libro|revista)+><!ENTITY % bibattrs“titulo CDATA #REQUIRED editorial CDATA #REQUIRED“><!ELEMENT libro EMPTY><!ATTLIST libro %bibattrs; autor CDATA #REQUIRED><!ELEMENT revista EMPTY><!ATTLIST revista %bibattrs; numero CDATA #REQUIRED>
biblioteca2.dtd
48
Resumen
XML = Texto estructurado
DTD = Descripción de estructura
Validar XML usando DTD