380 likes | 609 Views
XML. Modelos de documento (DTD). Introducción. Freeform XML Cualquier XML bien escrito ¿Cómo restringimos “estructura” y formato de nuestra aplicación XML? ¿Cómo verificamos la gramática y vocabulario del documento? Modelado de documentos Alternativas para el modelado
E N D
XML Modelos de documento (DTD)
Introducción • Freeform XML Cualquier XML bien escrito • ¿Cómo restringimos “estructura” y formato de nuestra aplicación XML? • ¿Cómo verificamos la gramática y vocabulario del documento? • Modelado de documentos • Alternativas para el modelado • DTD (Document Type Definition) • Schema (XMLSchema)
Introducción (II) • Modelo • Documento especial para describir lenguajes (aplicaciones) XML • Qué define un modelo • Qué elementos y atributos puede contener • “Gramática del documento”. P.e. un elemento <ul> sólo puede contener elementos <li> • Validación • XML válido que se adhiere a un modelo
¿Cuándo necesitamos un modelo? • Casos de interés • Documento XML Datos orientados a máquinas en vez de personas • Campos obligatorios El modelo asegura que esos campos están presentes • Ayuda a programas de edición WYSIWYG Presentan automáticamente campos a rellenar del documento • Forma sencilla de crear un estándar • Reutilización de trabajo anterior P.e. Docbook usa formato tablas de CALS
Validación de un doc • Documento validado incluye document type declaration que apunta a un DTD en prólogo <!DOCTYPE persona SYSTEM "http://www.captiva.es/dtds/persona.dtd"> • Localización del DTD • SYSTEM Indica una URL o fichero del sistema • Public ID • Localización de DTDs públicos (p.e. estándares) • Especifican un ID Catálogo (espec OASIS) resuelve URL <!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd"> • Necesitamos definir documento DTD (Document Type Definition). persona.dtd • Sintáxis no XML • Heradado de SGML • Limitaciones XML Schema
Validación de un doc (II) • Ejemplo de DTD (persona.dtd): • ¿Qué describe este documento? • 6 elementos válidos Declaración de elementos • No es necesario aunque aconsejable 1 declaración por línea • Parentesco • identidad y profesion hijos de persona • nombre, apellido1 y apellido2 hijos de identidad • Cardinalidad • Uno y sólo un elemento identidad por persona • Cero o varios elementos profesion por persona (*) • Orden • identidad debe preceder a profesion • identidad debe contener en este orden a nombre apellido1 apellido2 • Contenido • Algunos nodos pueden contener hijos • Otros pueden contener datos #PCDATA (Printable Character Data)
Validación de un doc (III) • Ejemplo de archivo válido (persona.xml): • Ejemplo de archivos inválidos (persona-invalido1.xml y persona-invalido2.xml)
Validación de un doc (IV) • Orden de declaración de elementos en DTD no es importante • Ejemplo de DTD alternativo (persona2.dtd):
Validación de un doc (V) • Validación online • http://www.stg.brown.edu/service/xmlvalid/ • Validación local • Jedit • XML Cooktop
Estructura de un DTD • Partes • Prólogo • No es obligatorio • Similar a la de un documento XML • <?xml version=“1.0”?> • Declaraciones • Elementos • Atributos • Entidades • Notaciones • Datos en bruto
Declaración de elementos • Partes <!ELEMENT nombre_elementomodelo-contenido> • Tipos de modelos de contenido • Elementos vacíos <!ELEMENT elementoEMPTY> • Elementos sin restricciones de contenido <!ELEMENT elementoALL> • Elementos que contienen sólo caracteres de datos <!ELEMENT elemento(#PCDATA)> • Elementos que contienen elementos <!ELEMENT elemento(elemento2, elemento3)> <!ELEMENT elemento(element2+, (elemento3 | elemento4)> • Elementos con contenido mixto <!ELEMENT elemento(#PCDATA | elemento2)*>
Declaración de elementos (II) • Modificadores para modelos de contenido
Declaración de elementos (III) • Ejemplo <!ELEMENT articulo (titulo, subtitulo?, autor*, (parrafo | tabla | lista)+, bibliografia?)> • Análisis • titulo • Debe haber sólo un elemento y ser el primer hijo de articulo • subtitulo • Es opcional y si existe debe ir después de titulo • autor • Es opcional y puede haber cualquier número. Debe ir después del titulo y subtitulo • Texto • Puede estar compuesto por elementos e tipo parrafo, tabla o lista en cualquier número. Debe haber como mínimo uno de estos elementos • bibliografia • Opcional y debe ser el último hijo de articulo.
Declaración de elementos (IV) • Elementos con contenido mezclado • <!ELEMENT parrafo (#PCDATA | referencia)*> • Ejemplo DTD completo (articulo.dtd):
Declaración de elementos (V) • Instancia de articulo invalida (articulo-invalido.xml) • Ejercicio opcional: Modificar DTD para que sea válido.
Declaración de elementos (V) • Instancia de articulo valida (articulo.xml)
<!ATTLIST > elemento nombre_atrib1 tipo_atrib1 desc_atrib1 nombre_atrib2 tipo_atrib2 desc_atrib2 Declaración de atributos • Un documento debe declarar todos los atributos posibles, no sólo los elementos • Formato • Ejemplo • <!ATTLIST image source CDATA #REQUIRED> • Atributo “source” para elemento “image” contiene CDATA (cualquier carácter) y es obligatorio (#REQUIRED).
Declaración de atributos (II) • Tipos de atributos posibles • CDATA • NMTOKEN • NMTOKENS • Enumeración • ID • IDREF • IDREFS • ENTITY • ENTITIES • NOTATION
Declaración de atributos (III) • Atributo tipo CDATA (character data) • Tipo de atributo más general • Acepta cualquier carácter XML válido • Permite el uso de ENTITIES de carácter y generales • Uso: <!ATTLIST image alt CDATA #IMPLIED> • Atributos válidos: <image alt=“Esta es una ‘imagen’”> <image alt=“AT&T”> <image alt=“5 - 1 + 4 * 2 < 100 ”> <image alt=“http://www.captiva.es/”>
Declaración de atributos (IV) • Atributo tipo NMTOKEN (name token) • Cadena con restricciones similares a nombre de elemento (aunque puede comenzar por número o un punto) • Uso: <!ATTLIST item serial NMTOKEN #REQUIRED> • Atributos válidos: serial=“aeiou” serial=“12.12” serial=“v3.3-5” serial=“fichero.txt”
Declaración de atributos (V) • Atributo tipo NMTOKENS • Lista de NMTOKEN separada por espacios • Uso: <!ATTLIST articulo palabras_clave NMTOKENS #IMPLIED> • Atributos válidos: palabras_clave=“perro gato gallo” palabras_clave=“texto.txt texto.doc texto.pdf” palabras_clave=“11-2-2005 11-3-2006”
Declaración de atributos (VI) • Atributo tipo enumeración • En realidad es un conjunto de valores válido • Se separan los valores con ‘|’ • Uso: <!ATTLIST fecha dia_festivo (sábado | domingo) #REQUIRED> • Ejemplos: <!ATTLIST fecha dia_semana (lunes | martes | miércoles | jueves | viernes | sábado | domingo) #REQUIRED> <!ATTLIST fecha mes_año (enero | febrero | marzo | abril | mayo | junio | julio | agosto | septiembre | octubre | noviembre | diciembre) #REQUIRED>
Declaración de atributos (VII) • Atributo tipo ID (identificador único) • Nombre XML que ha de ser único para todos los atributos ID del documento • Sirve para identificar unívocamente un elemento del documento • Sólo puede haber un atributo de este tipo por elemento • Uso: <!ATTLIST persona dni ID #REQUIRED> • Atributos válidos: dni=“_32232238S” • Atributos inválidos: dni=“32232238S”
Declaración de atributos (VIII) • Atributo tipo IDREF (referencia a identificador) • Igual que ID solo que referencia al ID de otro elemento • Si no existen ningún elemento con el ID indicado daría error • Uso: <!ATTLIST cita ref IDREF #REQUIRED> • Atributo tipo IDREFS • Lista de IDREF separada por espacios • Uso: <!ATTLIST libros refs IDREFS #REQUIRED>
Declaración de atributos (IX) • Atributo tipo ENTITY (nombre de entidad) • Acepta como valor el nombre de una entidad definida en el DTD • Uso: <!ATTLIST itemlista viñeta ENTITY #REQUIRED> <!ENTITY cuadro SYSTEM “iconos/cuadro.gif”> <!ENTITY circulo SYSTEM “iconos/circulo.gif”> • Atributos válidos: <itemlista viñeta=“cuadro”> • Atributo tipo ENTITIES • Lista de entidades separada por espacios • Uso: <!ATTLIST itemlista viñetas ENTITIES #REQUIRED> • Atributos válidos: <itemlista viñetas=“cuadro circulo”>
Declaración de atributos (X) • Atributo tipo NOTATION • Contiene el nombre de una notación definida en el DTD • Declaración de notaciones: <!NOTATION gif SYSTEM "image/gif"> <!NOTATION tiff SYSTEM "image/tiff"> <!NOTATION jpeg SYSTEM "image/jpeg"> <!NOTATION png SYSTEM "image/png"> • Uso: <!ATTLIST image type NOTATION (gif | tiff | jpeg | png) #REQUIRED>
Declaración de atributos (XI) • Descripciones de atributo • Tras el tipo de atributo se ha de especificar una de las siguientes descripciones • #IMPLIED • El atributo es opcional. No se le asigna ningún valor por defecto • #REQUIRED • El atributo es obligatorio • #FIXED • Se le asigna un valor fijo al atributo incluso si no se especifica. Si se especifica ha de darle este valor. <!ATTLIST biography xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink"> • Literal • Valor por defecto para un atributo <!ATTLIST recurso protocol NMTOKEN "http">
Declaración de entidades • Tipos de declaraciones de entidades • Entidad general • Sirve para substituir texto. • <!ENTITY saludo “Hola Buenos Dias”> • Referencia &saludo; • Entidad general externa • Contiene texto de una fuente externa. • <!ENTITY man SYSTEM “/pub/docs/manual/man.htm”> • Entidad externa nonparsed • El contenido externo no tiene por qué ser XML. Puede ser datos binarios incluso. • <!ENTITY logo SYSTEM “http://www.captiva.es/001/imagenes/logo.gif” NDATA gif> • gif es una referencia a NOTATION definida en algún lado
Declaración de entidades (II) • Tipos de declaraciones de entidades (II) • Entidad parámetro • Substitución para texto de DTD • <!ENTITY % textoparrafo “(#PCDATA | referencia) ” > • La referencia a la entidad se haría con %textoparrafo; • Especie de MACROS para DTDs • Entidad parámetro externa • Igual que la anterior pero hace referencia a DTD o trozo de DTD residente en fichero externo • <!ENTITY % tablas PUBLIC “-//Mis Tablas/DTD Tablas 1.1//ES” “/dtds/tablas.dtd” > • La referencia %tablas;
Declaración de entidades (III) • Modularización de DTDs • Entidad parámetro externas Permiten importar ficheros • Entidad parámetro pueden redefinirse. Tiene más prioridad última definición • Permite adaptar entidades incluidas a través de entidades parámetro externa • Inclusión condicional <![CONDICION[ <!– Directivas DTD --> ]]> • Si CONDICION == “INCLUDE” se incluye el fragmento de DTD • Si CONDICION == “IGNORE” no se incluye
Declaración de entidades (IV) • Modularización de DTDs (II) • Ejemplo: • Fichero casas.dtd <!ELEMENT casa (tejado, pared+)> • Fichero miscasas.dtd <!–- Importamos casas.dtd --> <! ENTITY % fich_casas SYSTEM “casas.dtd” > %fich_casas; <! ENTITY % condicion “INCLUDE” > <[ %condicion; [ <!-- Al ser condicion == “INCLUDE” se redefine elemento casa --> <!ELEMENT casa (tejado, pared+, suelo)> ]]>
Internal subset • Zona dentro de documento XML para definir elementos de DTD <?xml version="1.0"?> <!DOCTYPE persona SYSTEM “/dtds/persona.dtd” [ <!-– Internal subset --> <!ELEMENT persona (identificacion+, profesion*)> <!ELEMENT identificacion EMPTY> <!ATTLIST identificacion dni CDATA #REQUIRED> <!ELEMENT profesion EMPTY> <!ATTLIST profesion valor CDATA #REQUIRED> ]> • El internat subset tiene más prioridad que el external subset (el fichero DTD especificado con DOCTYPE) • Útil para redefinir elementos de un DTD genérico sólo para la instancia dada de XML
Internal subset • Zona dentro de documento XML para definir elementos de DTD <?xml version="1.0"?> <!DOCTYPE persona SYSTEM “/dtds/persona.dtd” [ <!-– Internal subset --> <!ELEMENT identificacion EMPTY> <!ATTLIST identificacion dni CDATA #REQUIRED> ]> • El internal subset tiene más prioridad que el external subset (el fichero DTD especificado con DOCTYPE) • Útil para redefinir elementos de un DTD genérico sólo para la instancia dada de XML
Ejemplo I: Articulo • Fichero (articulo-completo.dtd) • Se ha incorporado ENTITIES • Incorporamos atributos a algunos elementos
Ejemplo I: Articulo (II) • Fichero (articulo-completo.xml) • Definimos dos Unparsed Entities para indicar las imágenes a usar como elemento de listas • Incorporamos referencias cruzadas entre <referencia> y <recurso> de bibliografía
Otros ejemplos • Estándar XHTML 1.0 Strict • Directorio ‘xhtml’ dentro de prácticas • http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd • Fichero xhtml1-strict.dtd en directorio • Ejemplos de ficheros XHTML • ejemplo_local_novalidable.html • ejemplo_publico_invalido.html • ejemplo_publico_validado.html
Ejercicio • Coger casino.xml de 2º capítulo • Crear DTD, teniendo en cuenta las limitaciones • Puede haber 0,1 o más mesas de juego • Se definirán las siguientes ENTITIES al comienzo del DTD: • %juegos • %palos • %palo_por_defecto • Los juegos posibles son: “brisca”, “tute”, “poker” • Cada mesa debe tener como mínimo un jugador • Cada jugador debe tener al menos una carta • El jugador puede tener o no nombre • Las cartas han de ser de los palos: “oros”, “copas”, “espadas” ó “bastos”, no siendo obligatorio indicarlo. Por defecto será de tipo “oros” • Segunda parte • Añadir un identificador único “dni” para cada jugador • Añadir un juego más posible: “sieteymedia”