XML DTD

De MediaWiki
Ir a la navegación Ir a la búsqueda


XML e DTDs

O obxectivo duhna DTD (document type definition ou definición de tipo de documento) é definir a estrctura dun documento XML. Isto é, establecer a gramática que contendrá as restriccións que deben cumprir os elementos do XML.

Cando asignamos unha DTD a un documento podemos verificar se o documento é correcto: a súa estrutura responde ao definido na DTD.

Veremos en profundidade na sección XML DTD como levar a cabo esta validación de documentos XML.

Validación de documentos XML

O proceso de comparar un documento XML coa súa DTD para comprobar se a súa estrutura é correcta denomínase validación; e lévase a cabo por medio dun analizador que interpreta o documento. Os navegadores web dispoñen do seu propio analizador XML que permite verificar se unha páxina web se axusta á estrutura definida para HTML.

Un documento XML é válido se está ben formado (ten unha sintaxe XML correcta) e ademáis se axusta as regras dunha DTD.

Declaración de tipo de documento: interna e externa

Para poder verificar se un documento XML é valido o analizador precisa coñecer a súa gramática para validar a súa construcción. Existen dous xeitos de vincular a información da súa estrutura cun documento XML:

  • mediante a inserción das reglas da gramática dentro dun ficheiro XML
  • engadindo unha referencia a un ficheiro DTD onse definirá a gramática do documento

Porén, unha DTD pódese escribir tanto interna como externamente a un ficheiro XML; e en todo caso hai que escribir unha definición DOCTYPE (Document Type Declaration, Declaración de Tipo de Documento) para asociar o documento XML á DTD.

NOTA. Un fichero XML pódese asociar simultáneamente a unha DTD interna e externa (ver exemplo).
REFLEXIONA. Cando empregar unha DTD interna ou unha DTD externa?
Para validar máis dun documento XML coa mesma DTD, escribir esta nun ficheiro externo proporciona a vantaxe de non ter que repetir a DTD internamente en cada documento XML.
Para validar un único documento XML o habitual será escribila internamente

Tanto nun caso coma no outro débese indicar no DOCTYPE do documento XML cal é o seu elemento raíz e a continuación as regras que debe cumprir (incluíndoas directamente ou referenciando ó documento que as contén):

<!DOCTYPE elemento_raiz SYSTEM "fichero.dtd">

No prólogo dun documento XML ben formado, ademáis da versión da linguaxe XML inclúese un atributo “standalone”:

<?xml version="1.0" standalone="yes"?>

Este termino standalone permite especificar se o documento é "autosuficiente" ou depende dalgún outro documento ou recurso. Por exemplo, unha DTD onde se defina a súa gramática.

Se incluimos a declaración da gramática dentro do propio ficheiro XML (no seu DOCTYPE), o documento terá “standalone=yes”, xa que no dependerá de ningún outro. A declaración vai no DOCTYPE inserida entre corchetes.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Declaraciones DTD-->
<!DOCTYPE tema [ 
<!ELEMENT tema (autor, apartado+)>
<!ATTLIST tema titulo CDATA #REQUIRED unidade CDATA #REQUIRED>
<!ELEMENT autor (#PCDATA)>
<!ELEMENT apartado (#PCDATA)>
<!ATTLIST apartado numero CDATA #REQUIRED> ]>
<!-- Datos XML-->
<tema unidade="3" titulo="XML">
  <autor>Cristina Puga</autor>
  <apartado numero="1">Contido do apartado 1</apartado>
  <apartado numero="2">Contido do apartado 2</apartado>
</tema>

Se definimos a súa gramática nun fichero externo (nota.dtd), o atributo standalone terá o valor “no”. Para referenciar un documento externo farémolo tamén no DOCTYPE do XML:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<!DOCTYPE nota SYSTEM "nota.dtd"> 
<nota> 
 <destinatario>Tove</destinatario> 
 <remitente>Jani</remitente> 
 <cabeceira>Recordatorio</cabeceira> 
 <corpo>Chámame!</corpo> 
</nota>

O ficheiro onde se inclúe a DTD pódese referenciar por medio da súa ruta relativa ou por medio dunha URI:

Bloques de construción de DTD
<!DOCTYPE notas SYSTEM "http://www.servidor.org/dtd/notas.dtd">

Definición da DTD

Os bloques de construción de DTD serán descritos a continuación.

Elementos

Os elementos son os nodos da árbore dun documento XML. Defínense así:

<!ELEMENT nomeElemento contido>

Existen dous tipos de elementos:

  • os elementos terminais (as follas da árbore XML)
  • os elementos non terminais (as ramas, que son elementos anidados)

Os elementos anidados ou non terminais son os que teñen subelementos:

<!ELEMENT listadeproductos (produto)>
<!ELEMENT produto (nome,codigo,prezo)>

Os elementos terminais teñen algún tipo de datos:

<!ELEMENT nome (#PCDATA)> 
<!ELEMENT codigo (#PCDATA)> 
<!ELEMENT prezo (#PCDATA)>

Cando definimos un agrupamento de subelementos, os datos textuais #PCDATA deben aparecer sempre en primeira posición.

Sobre os subelementos e os agrupamentos de subelementos podemos aplicar os seguintes operadores:

  •  ? - pode incluirse ou non (0 o 1 vez)
  • * - pode repetirse ou non (0 o máis veces)
  • + - debe incluirse e pode repetirse (1 ou máis veces)

Exemplo:

<!ELEMENT modulo(nome,(horas|créditos),profesor*,aula,taller?)> 
<!ELEMENT nome (#PCDATA)> <!ELEMENT horas (#PCDATA)> 
<!ELEMENT profesor (#PCDATA)> <!ELEMENT aula (#PCDATA)> 
<!ELEMENT taller (#PCDATA)>

Pode haber elementos baleiros, de datos (PCDATA), con calquer contido (ANY), con fillos (fillo1,fillo2...), cun so elemento (fillo), cunha ocurrencia dun elmento como mínimo (fillo+), 0 ou máis ocurrencias dun elemento (fillo*),0 ou unha ocurrencia do elemento (fillo?), un ou outro contido (fillo1|fillo2) ou contido mixto (#PCDATA|fillo1|fillo2|fillo3 )*

Atributos

Os atributos dun elemento defínense así:

<!ATTLIST nomeElemento 
  Atributo1 tipo valor 
  Atributo2 tipo valor 
  ... >

O tipo do atributo pode ser:

  • CDATA: character data, pode tomar calquer valor de texto.
<!ATTLIST profesor nome CDATA #REQUIRED>
  • Lista entre paréntesis cos posibles valores que pode tomar separados polo operador |.
<!ATTLIST tipo dietetico (si|no) #REQUIRED>
  • ID: identificador do elemento. Debe ser único no documento e debe comezar por unha letra ou polo caracter de subliñado:
<!ATTLIST profesor id ID #REQUIRED>
  • IDREF: son referencias a identificadores (atributos definidos como ID). O valor do atributo IDREF debe corresponder a un identificador de elemento existente no documento.
<!ATTLIST alumno titor IDREF #IMPLIED>
  • IDREFS: permite especificar varias referencias a identificadores dentro de la declaración de un atributo. Las distintas referencias irán separadas por un espacio en blanco. O valor pode ser:
  • #REQUIRED: obliga a especificar o atributo.
  • #IMPLIED: permite non especificar o atributo sen que tome un valor por defecto.
  • #FIXED valor: o valor do atributo permanece constante para ese elemento en todo o documento.

Exemplo:

<!ELEMENT libro (receita | ingrediente)*> 
<!ELEMENT receita #PCDATA> 
<!ATTLIST receita id ID #REQUIRED> 
<!ELEMENT ingrediente #PCDATA>  
<!ATTLIST ingrediente ref IDREFS #IMPLIED>
<libro>
  <receita id="rec_1">Filloas</receita>
  <receita id="rec_2"> Flan de queixo </receita>
  <receita id="rec_3"> Torta de mazá </receita>
  <ingrediente ref="rec_1 rec_3">ovos</ingrediente>
  <ingrediente ref="rec_2">Queixo</ingrediente>
  <ingrediente ref="rec_1 rec_2">Leite</ingrediente>
</libro>

O valor pode ser:

  • #REQUIRED: obliga a especificar el atributo.
  • #IMPLIED: permite no especificar el atributo, sin que tome un valor por defecto.
  • #FIXED valor: o valor do atributo permanece constante para ese elemento en todo o documento.
  • valor predefinido: especifícase directamente o valor por defecto que tomará o atributo se non se indica ningún valor
 <!ATTLIST tipo dietetico CDATA #FIXED “descoñecido”>

Os atributos dun elemento podense indicar de dous xeitos.

Uns a continuación doutros:

<!ATTLIST ciclo codigo CDATA #REQUIRED grao CDATA #REQUIRED>

Ou en distintas etiquetas:

<!ATTLIST ciclo codigo CDATA #REQUIRED> 
<!ATTLIST ciclo grao CDATA #REQUIRED >


Entidades

As entidades permiten facer referencia a outros contidos que se incrustarán no documento no momento de ser procesados, e que non deben ser analizados sintácticamente segundo as regras de XML. Isto inclue "abreviaturas" para termos que se repiten moito ou fragmentos de código que non debe interpretar o parseador, polo que adoitarn ser utilizados para definir macros, scripts ou constantes.

Entidades internas predefinidas

XML ten algunhas entidades internas predefinidas para permitir inserir caracteres que teñen un significado especial en XML, coma os símbolos <, >, etc.

A seguinte táboa lista cinco entidades predefinidas de XML:

  • A columna "Nome" menciona o nome da entidade.
  • A columna "Carácter" amosa o carácter en si mesmo. Para reproducir o carácter utilízase o prefixo "&" e o sufixo ";": &nome;. Por exemplo, o carácter et codifícase coma &amp; e se reproduce coma &.
  • A columna "Punto de código Unicode" cita o carácter mediante o código estándar de notación UCS/Unicode "U+", que amosa o punto de carácter en hexadecimal. O equivalente decimal do carácter está escrito no paréntese.
  • A columna "Estándar" indica a primera versión de XML que inclúe a entidade. A columna "Descripción" cita o carácter polo seu nome común, case siempre unha traducción dos asignados na notación UCS/Unicode.
Nome Carácter Punto de código Unicode Estándar Descripción
quot " U+0022 XML 1.0 comillas dobles
amp & U+0026 XML 1.0 símbolo et (&) ou ampersand
apos ' U+0027 XML 1.0 apóstrofo
lt < U+003C XML 1.0 signo menor que
gt > U+003E XML 1.0 signo maior que

Declaración e uso de entidades

Entidades

As entidades decláranse do seguinte xeito:

<!ENTITY nomeEntidade "cadea a reemplazar">

Por exemplo:

<!ENTITY cidade "Ferrol">

Para usalas no documento teremos que escribir:

&nomeEntidade;
&cidade;
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE tarxetaVisita [ 
<!ENTITY cidade "Ferrol"> ]>
<tarxetaVisita>
  <apelidos>Chousa Blanco</apelidos>
  <nome>Alba</nome>
  <profesion>Profesor</profesion>
  <enderezo>
    <rua>Ponzano</rua>
    <numero>64</numero>
    <poboacion>&cidade;</poboacion>
    <cp>15570</cp>
  </enderezo>
</tarxetaVisita>

Elementos vs atributos

Usar atributos so con ids

En xeral é aconsellable empregar os atributos o menos posible, polos seguintes problemas:

  • no poden conter varios valores (comparados cos elementos secundarios que si poden)
  • non son fácilmente extensibles para futuros cambios
  • no poden describir as estruturas (elementos secundarios poden)
  • son máis difíciles de manipular polo código do programa
  • os seus valores non son fáciles de probar cunha DTD

O máis recomendable é so utilizar atributos como identificador único.

Carencias das DTDs

As DTDs úsanse cada vez menos gracias sobre todo á existencia de linguaxes de validación máis modernas.

Os principais problemas das DTDs son:

  • Ausencia de tipos de datos: únicamente podemos dicir que un valor é de tipo PCDATA, polo que podemos validar a estrutura do documento pero non o seu contido. Con DTDs non é posible indicar por exemplo:
  • que o contido da etiqueta <cantidade> debe ser un número positivo.
  • que o contenido da etiqueta <mes> debe ser un número entero entre 1 e 12.
  • que o texto da etiqueta <title> sexa unha cadea de ata 255 caracteres.
<!—DTD -->
<!ELEMENT gardaria (neno*)>
<!ELEMENT neno (nome, datnacemento, peso, altura, vacinas)>
<!ATTLIST niño numeroExpediente CDATA #REQUIRED>
<!ELEMENT nome (#PCDATA)>
<!ELEMENT datnacemento (#PCDATA)>
<!ELEMENT peso (#PCDATA)>
<!ELEMENT altura (#PCDATA)>
<!ELEMENT vacinas (#PCDATA)>
<!-- XML -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE gardaria SYSTEM "gardaria.dtd">
<gardaria>
  <neno numeroExpediente="popeye">
    <nome>cosas</nome>
    <datnacemento>1.1.1</datnacemento>
    <peso>non o sei</peso>
    <altura>falso</altura>
    <vacinas>no</vacinas>
  </neno>
</gardaria>

Este documento sería válido conforme a súa DTD a pesares de que os valores do documento non son correctos.

Porén, algunhas limitacións:

  • Non se definen en XML o que implica a necesidade de ter distintos analizadores e APIs para procesar o documento: un para a DTD e outro para o documento.
  • Non se permiten definir secuencias de atributos non ordeadas
  • Non é posible formar claves a partir de varios atributos ou elementos.
  • Son moi pouco extensibles, e é difícil combinar diferentes DTDs entre si.
  • Non son compatibles cos espazos de nomes XML.

Resumo de DTD (Definición de Tipos de Documentos)

  • Elementos
<!ELEMENT nomeElemento (elem fillo1, elem fillo2,...)>
  • Atributos
<!ATTLIST Elemento Atributo Tipo Valor>
  • Entidades
<!ENTITY nome valor>
  • Asociación DTD en XML:

Interna

<?xml version="1.0" standalone="yes"?>
<!DOCTYPE raiz [
     elementos
]>
<raiz type="web">
 <elementos> </elementos>
</raiz>
<?xml version="1.0" standalone="no"?>
<!DOCTYPE tutorials SYSTEM "tutorials.dtd">


Exercicios

Referencias