Indice del libro

Obiettivi di apprendimento

  • Comprendere che cos'è un Document Type Definition (DTD)
  • Imparare come dichiarare elementi e attributi in un DTD

Il DTD descrive la forma che deve avere un documento XML per essere valido. I DTD sono stati sostituiti dallo Schema XML, che è molto più potente, quindi ti incoraggiamo a usare quest'ultimo.

Tuttavia, discutiamo di DTD qui in modo che tu possa comprenderne uno se necessario. In particolare, potrebbe essere necessario trasformare un DTD in uno schema per utilizzare questa nuova tecnologia.

Specifica di un DTD

modifica

A differenza degli schemi, DTD non è un dialetto XML, è un linguaggio specifico.

Il DTD non è obbligatorio. Può essere interno al documento XML o esterno (in un file con l'estensione ".dtd"). Usiamo un DTD esterno quando vogliamo condividerlo tra diversi file XML.

Esempio di dichiarazione di un DTD esterno in un file XML:

<!DOCTYPE directory SYSTEM "directory.dtd">

Il DTD inizia con il tag:

 <!DOCTYPE elemento-radice [

e termina con:

 ]>

Il DTD deve essere inserito dopo la dichiarazione XML iniziale.

I commenti, come in XML, vengono inseriti come segue:

 <!-- commenti -->

Elementi

modifica

Ogni elemento del DTD è definito come segue:[1]

 <!ELEMENT nome-elemento qualificatore>

Possibili qualificatori sono:

  • ANY: la struttura dell'elemento è libera
  • EMPTY: l'articolo è vuoto
  • #PCDATA(Parsed Character Data): dati testuali analizzabili

Questi qualificatori possono essere specificati dai seguenti elementi:

  • uno e un solo sottoelemento:

(solo un telefono a persona)

  <! ELEMENT persona (telefono)>
  • 0 o più sotto-elementi:

(una persona può avere 0, 1 o più telefoni)

  <! ELEMENT persona (telefono*)>
  • 1 o più elementi:

(una persona deve avere almeno un telefono)

  <! ELEMENT persona (telefono+)>
  • 0 o 1 articolo singolo:

(una persona ha al massimo 1 telefono, potrebbe non averne uno)

  <! ELEMENT persona (telefono?)>
  • Diversi sotto-elementi:

(una persona ha un nome e un telefono)

  <! ELEMENT persona (nome, telefono)>
  • Sotto-elementi identici o non identici:

(una persona ha un nome e due numeri di telefono)

  <! ELEMENT persona (nome, telefono, telefono)>
  • Un elemento secondario OR (esclusivo) un altro:

(uno o due telefoni a persona)

  <! ELEMENT persona (telefono|(telefono, telefono))>

Esempio di memorizzazione di una directory di servizi. Ogni servizio ha un nome e può avere uno o più telefoni:

<?xml version="1.0" standalone="yes"?>
<!DOCTYPE directory [
	<!ELEMENT directory (service)*>
	<!ELEMENT service (nom, tel*)>
	<!ELEMENT nom (#PCDATA)>
	<!ELEMENT tel (#PCDATA)>
]>
<directory>
   <service>
      <nom>pompiers</nom>
      <tel>18</tel>
   </service>
   <service>
      <nom>police</nom>
      <tel>17</tel>
      <tel>22</tel>
   </service>
   <service>
      <nom>samu</nom>
      <tel>15</tel>
   </service>
</directory>

Attributi

modifica

Sono dichiarati con ATTLIST. Ad esempio, definiamo un tipo di pagamento predefinito in contanti:

<!ATTLIST pagamento type CDATA (assegno|liquidi) "liquidi" >

Valori degli attributi

modifica

I valori dell'attributo (attributo-valore[2]) sono:

Valore Descrizione
value valore predefinito dell'attributo
#REQUIRED attributo richiesto
#IMPLIED attributo opzionale
#FIXED value attributo a valore fisso

Tipi di attributi

modifica
Type Description
CDATA valore dei dati
(en1|en2|..) valore nell'elenco numerato
ID identificatore univoco
IDREF identificatore di un altro elemento
IDREFS elenco di altri identificatori
NMTOKEN nome di un XML valido
NMTOKENS elenco di nomi XML
ENTITY entità
ENTITIES elenco di entità
NOTATION nome di una valutazione
xml: valore di un XML predefinito

Entità

modifica

Dichiarare un'entità consente di integrarla chiamando il suo nome preceduto da una e commerciale, dal simbolo della percentuale o dalle virgolette (&, % o "[3]) e seguito da un punto e virgola (;). Per esempio:

<!ENTITY intro! SYSTEM "https://fr.wikibooks.org/wiki/Programmation_XML/Introduction.xml">!

<b>
 &intro;
</b>

Questo esempio è estratto dalla specifica XHTML[4] per i collegamenti ipertestuali:

<!ENTITY % attrs "%coreattrs; %i18n; %events;">
...
<!ELEMENT link EMPTY>
<!ATTLIST link
  %attrs;
  charset     %Charset;      #IMPLIED
  href        %URI;          #IMPLIED
  hreflang    %LanguageCode; #IMPLIED
  type        %ContentType;  #IMPLIED
  rel         %LinkTypes;    #IMPLIED
  rev         %LinkTypes;    #IMPLIED
  media       %MediaDesc;    #IMPLIED
  target      %FrameTarget;  #IMPLIED
  >
  1. http://www.w3schools.com/dtd/dtd_elements.asp
  2. http://www.w3schools.com/dtd/dtd_attributes.asp
  3. http://xmlwriter.net/xml_guide/entity_declaration.shtml
  4. http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd