Analizar el DTD Parametrizado
Esta sección usa el programa Echo para ver qué sucede cuando
referenciarmos xhtml.dtd en slideshow.dtd.
También cubre los tipos de avisos que genera el analizador SAX cuando hay presente un DTD.
Cuando probamos a mostrar la presentación encontramos que ahora contiene un nuevo error.
La parte relevante de la salida la hemos formateado para mejor lectura.
<?xml version='1.0' encoding='UTF-8'?>
** Parsing error, line 22,
uri file:.../slideshow.dtd
Element "title" was already declared.
org.xml.sax.SAXParseException: ...
Parece que xhtml.dtd define un elemento title
que es completamente diferente del elemento title definido en el
DTD slideshow. Como no hay herencia en el DTD, estas dos definiciones
están en conflicto.
|
Nota:
El DTD XHTML
Modularizado también define un elemento title que se
espera que sea el título del documento, por eso podemos evitar el conflicto cambiando
xhtml.dtd -- el problema nos volverá más adelante.
|
También usamos el espacio de
nombres XML para resolver el conflicto, o usamos una de las muchas
proposiciones de esquemas de árbol definidas en
Proposiciones de Esquemas.
Por ahora, simplemente renombraremos el elemento title en
slideshow.dtd.
Para mantener separados los dos elementos title, hemos resuelto
utilizar una "hyphenation hierarchy". Hacemos los cambios en negrita de abajo
al nombre del elemento title en slideshow.dtd
a slide-title:
<!ELEMENT slide (image?, slide-title?, item*)>
<!ATTLIST slide
type (tech | exec | all) #IMPLIED
>
<!-- Defines the %inline; declaration -->
<!ENTITY % xhtml SYSTEM "xhtml.dtd">
%xhtml;
<!ELEMENT slide-title (%inline;)*>
El siguiente paso es modificar el fichero XML para usar el nuevo nombre de elemento.
Para hacer esto, hacemos los cambios en negrita de abajo.
...
<slide type="all">
<slide-title>Wake up to ... </slide-title>
</slide>
...
<!-- OVERVIEW -->
<slide type="all">
<slide-title>Overview</slide-title>
<item>...
Ahora ejecutamos el programa Echo sobre esta versión de la presentación.
Debería ejecutarse completamente y mostrar una salida como la mostrada en
Echo10-09.log.
¡Felicidades! Acabamos de leer un documento XML completamente validado. Los cambios realizados
tienen el efecto de poner nuestro elemento title del DTD dentro de un
"nombre de espacio" de slideshow que hemos construido artificialmente
poniendo guiones al nombre.
Aviso del DTD
Como se mencionó anteriormente en este tutorial, los avisos se generan sólo cuando el
analizador SAX está procesando un DTD. Algunos avisos sólo son generados por el analizador
con validación. El objetivo principal del analizador sin validación es operar tan
rápidamente como sea posible, pero esto genera algunos avisos. La especificación XML
sugiere que los avisos deberían ser generados como resultado de.
- Proporcionar declaraciones adicionales para entidades, atributos o notaciones.
(Dichas declaraciones son ignoradas. Sólo se utiliza la primera. Observa también que las
definiciones duplicadas de elementos siempre producen un error fatal cuando se validan.)
- Referenciar un tipo de elemento no declarado.
(Un error de validación ocurre sólo si el tipo no declarado es usado realmente en el
documento XML. El aviso resulta cuando el elemento no declarado es referenciado en el DTD.)
- Declarar atributos para tipos de elementos no declarados
El Analizador SAX Java XML también emite avisos en otros casos, como.
- No hay un <!DOCTYPE ...> cuando se valida.
- Referenciar una entidad de parámetro no definida cuando no está validada.
(Cuando se valida, ocurre un error. Aunque el analizador sin validación no necesita leer
las entidades de parámetro, el analizador Java XML lo hace. Como no es requerido, genera
un aviso, en vez de un error.)
- Ciertos casos donde la declaración de codificación de caracteres no parece correcta.
Hasta este punto, hemos digerido muchos conceptos XML, incluyendo DTDs, entidades externas.
También hemos aprendido nuestra propia forma de evitar el analizador SAX. El resto del
tutorial SAX cubre los tópicos avanzados que sólo necesitaremos si escribimos aplicaciones
basadas en SAX. Si nuestro objetivo primario es escribir aplicaciones basadas en DOM,
podemos saltar a Manipular Contenidos de Documentos
con un Modelo de Objeto Documento.