Guide: XML (DocumentType Definitions DTDs)

[Aufbauend auf den vorherigen Guide]

4. Documenttype Definitions

Die Documenttype Definitionen beschreiben die Struktur von XML- und SGML Dokumenten. Es bestimmt die Struktur von Dokumenten. In einer DTD werden Attribute, Elemente usw. definiert.

Da die DTD ist ein Bestandteil der XML Spezifikation, was allerdings später von vielen kritisiert wurde, da der DTD Syntax kein XML Syntax ist. Für XML Dokumente wurde ein eigene Spezifikation, das XML Schema (oder in kurz: XSD) geschaffen.

Diese XSD verfolgt dasselbe Ziel wie die DTD, ist jedoch etwas komplexer und ist komplett im XML Syntax verfasst.

Da die DTD jedoch trotzdem noch eine Rolle spielt, wird sie hier trotzdem noch behandelt.
 

4.1 “Documenttyp-Definition” (DTD) und Instanzen

Die wenigsten die HTML Dokumente verfassen, werden sich mit der DTD beschäftigt haben, da die DTD für HTML fest in den Händen des W3Cs liegt, allerdings gibt es nun mit XML die Möglichkeit eigene Elemente zu schaffen, welche z.B. aber nur bestimmte Attribute bekommen dürfen.

Einige Beispiele entstammen der XHTML DTD vom W3C, welche sich hier einsehbar ist:

http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd
 

4.1.1 Elementtypen

Die wichtigsten Komponenten einer DTD sind die Element-Deklarationen.

Die Elementtypen weisen einem Element und sein möglicher Inhalt definiert.

Folgende Elementtypen gibt es in einer DTD:

  • Empty – kein Inhalt
  • Any – für beliebigen Inhalt
  • , – Reihenfolge
  • | – Alternative
  • Runde Klammern zum Gruppieren
  • Stern für keinmal oder mehrmals
  • Plus für einmal oder mehrmals
  • Fragezeichen für einmal oder keinmal
  • Wird weder Stern, Plus oder Fragezeichen verwendet, muss das Element min. einmal vorkommen
  • Texte, welche den Elementen angehören, werden als PCDATA (Parsed Character Data) deklariert.

Syntax: <!ELEMENT elementname elementtyp>

Beispiel:
<!ELEMENT img EMPTY>
<!ELEMENT table
     (caption?, (col*|colgroup*), thead?, tfoot?, (tbody+|tr+))>

4.1.2 Entities

Wie bereits schon vorhin kurz erwähnt, dienen Entities der Wiederverwendbarkeit. Dabei wird eine bestimmte Zeichenkette festgelegt, welche beim Aufrufen dieser durch eine vorher festgelegte andere Zeichenkette oder ein anderes Dokument ersetzt wird.

4.1.2.1 Interne Entities

Ein internes Entity besteht nur aus dem Namen und der Zeichenkette, welche später eingesetzt werden soll.

Syntax: <!ENTITY namezeichenkette“>

Aufgerufen wird dieses Entity mit einem & und dem namen sowie einem Semikolon.

Syntax: &name;

Beispiel: 

<!ENTITY dtag "Deutsche Telekom AG">

Anwenden würden wir dieses Entity mit “&dtag;”

Die Zeichenkette kann im Prinzip alles enthalten: Normale Texte, neue Entitys oder XML.

Beispiel: 

<!ENTITY dtag "Deutsche Telekom AG"> 

<!ENTITY tt_link "<a href=”™training.telekom.de”™>Telekom Training</a>” > 

<!ENTITY division "&dtag; - Telekom Training">

4.1.2.2 Externe Entities

Externe Entities verweisen auf den Inhalt von den angegebenen Dateien. Nach dem Namen wird noch notiert, ob dieses Entity öffentlich (“PUBLIC”), d.h. es wird nicht nur auf der Website sondern im ganzen Intranet oder ist vom W3C standardisiert oder es ist nur systemweit (“SYSTEM”). Allerdings spielen diese beiden Sachen keine große Rolle.

Syntax: <!ENTITY name SYSTEM/PUBLIC “datei“>

Beispiel: 

<!ENTITY kapitel1 SYSTEM "kapitel1.xml">

Bei Externen Entities kann man zusätzlich angeben, wenn es um ein nicht analysiertes Entity handelt, d.h. der Inhalt besteht aus beliebigen Daten. In diesem Fall muss eine Notation angegeben werden:

Beispiel: 

<!ENTITY BMP_Bildchen SYSTEM "bild.bmp" NDATA bmp>

4.1.3 Parameter-Entities

Normale Entities werden verwendet, wenn man auf der Website bestimmte Abkürzungen nutzen will. Da sich auch in einer DTD häufig Deklarationen doppeln, wird hier mit sog. Parameter-Entities gearbeitet. Dadurch lassen sich auch externe Daten in die DTD einbinden.

Syntax: <!ENTITY % namezeichenkette“>

Beispiel: 

<!ENTITY % headlines "H1|H2|H3|H4|H5|H6|H7">

4.1.4 Attribute

Elemente können bestimmte Attribute enthalten. Welches Element, welches Attribut enthält wird in der DTD festgehalten.

4.1.4.1 Attributtypen

  • CDATA – steht für beliebigen Inhalt
    • PCDATA und CDATA sind vom Prinzip her gleich
    • In ihnen werden beliebige Texte gespeichert
    • Unterschied liegt daran, dass PCDATA vom Parser durchsucht wird und kann zum Beispiel Entities oder XML Daten parsen (“Parsed Character Data”).
    • In CDATA werden keine Markupzeichen, wie z.B. spitze Klammern erkannt.
Beispiel in der DTD: 

<!ATTLIST IrgendEinElement 

Sprache CDATA 

> 

Beispiel in der XML Datei: 

<IrgendEinElement Sprache="deutsch123">Dies hier ist ein Text.</IrgendEinElement>
 
  • ID
    • steht für einen eindeutigen Bezeichner
    • darf aus Buchstaben und Zahlen und Kombinationen dessen bestehen
Beispiel in DTD: 

<!ATTLIST IrgendEinElement 

Sprache_id ID 

>Beispiel in der XML Datei: 

<IrgendEinElement Sprache_id="123">Dies hier ist ein Text.</IrgendEinElement>
  • IDREF
    • steht für eine Referenz auf einen Bezeichner
    • dient dazu, dass eine ID nicht zweimal vergeben wird, wenn ein Element die augenscheinliche selbe ID vergeben will
Beispiel in DTD: 

<!ATTLIST Produkt 

Hersteller_id IDREF 

>Beispiel in der XML Datei: 

<Produkt Herstellter_id="123">Hammer</Produkt>
 
  • NMTOKEN
    • ähnelt dem CDATA, hat allerdings ein paar Einschränkungen
    • steht für Name Token
Beispiel in DTD: 

<!ATTLIST IrgendEinElement 

Sprache NMTOKEN 

>Beispiel in der XML Datei: 

< IrgendEinElement Sprache="de DE">Testtext</ IrgendEinElement >
 
  • Aufzählungen
    • Nur angegebene Werte dürfen im Attribut vorkommen
Beispiel in der DTD: 

<!ATTLIST IrgendEinElement 

Sprache (deutsch|englisch|spanisch) 

>Beispiel in der XML Datei: 

<IrgendEinElement Sprache="deutsch">Dies hier ist ein Text.</IrgendEinElement> 

<IrgendEinElement Sprache="englisch">Nice work!</IrgendEinElement>

4.1.4.2 Attributvorgaben

Mittels Vorgaben kann man Attribute vorbelegen oder sagen, ob das Attribut zwingend vorhanden sein muss oder nicht.

  • #REQUIRED – Attribut muss angegeben werden
  • #IMPLIED – Attribut kann angegeben werden
  • #FIXED “…” – Attribut hat immer einen Standardwert
  • “…” – Attribut hat bei Nichtzuweisung diesen Standardwert

4.1.4.3 Attributlisten

In den Listen erfolgt die Zuordnung.

Syntax: <!ATTLIST elementname

Name typ Vorgabewert

> 

Beispiel: 

<!ATTLIST wohnort 

plz   CDATA #REQUIRED 

strasse    CDATA #REQUIRED 

hausnr   CDATA #IMPLIED 

land   CDATA #FIXED "germany" 

>

4.1.5. Einbindung der DTD in XML

4.1.5.1 Externe Verweise

Beispiel: 

<?xml version=”1.0” standalone=”yes”?> 

<!DOCTYPE lala SYSTEM "lala.dtd”> 

<lala>Dumdidum</lala>

4.1.5.2 Interne Verweise

Beispiel: 

<?xml version=”1.0” standalone=”yes”?> 

<!DOCTYPE lala [ <!ELEMENT (#PCDATA) >] > 

<lala>Dumdidum</lala>

Der Name muss dem des Wurzelelementes entsprechen!

Letzte Posts

  • image.png
    Microsoft Account Login via ASP.NET Identity

    Der Microsoft Account ist die zentrale Identifikationsstelle in der “Consumer-Microsoft-Welt”, allerdings ist das Einbinden eben dieser in die eigene Applikation eher schwierig. Das “Live SDK” ist nun unter dem OneDrive Dev Center zu finden und ganz professionell wurden auch alle Links zum alten Live SDK damit unbrauchbar gemacht. Beim Microsoft Account ist es auch unmöglich […]

  • image.png
    Zeitgesteuerte Azure WebJobs – so einfach kann Azure sein

    Das noch in Entwicklung befindliche Azure WebJob SDK bietet einige coole Features zum Verarbeiten und Bereitstellen von Daten. Bekanntes Beispiel ist das Sample welches auf eine Azure Queue lauscht und sobald ein Item da vorhanden ist anfängt dies zu verarbeiten. Szenario: Zeitgesteuerte Aktivitäten – ohne Queue und co. Mein Szenario war allerdings wesentlich trivialer: Ich […]

  • image.png
    Get Involved in OSS! Ja, aber wie geht das denn mit GitHub?

    Auch im .NET Lager gibt es Bewegung im OSS Bereich und es gibt verschiedene Arten wie man bei einem Open Source Projekt “Contributed”. Was zählt alles zu “Contribution”? Unter “Contribution” läuft eigentlich alles – ob es Fragen/Probleme zu dem Projekt via Issues ist oder Dokumentation nachreicht oder ob man darüber bloggt oder das Projekt vorstellt. […]

  • HowTo: Web.config samt eigener ConfigSection zur Laufzeit ändern

    In dem HowTo geht es darum wie man die Web.config zur Laufzeit ändert und was es dabei zu beachten gilt. Das ganze klappt auch mit komplexeren ConfigSections. Eigene ConfigSection? Vor einer ganzen Weile habe ich mal über das Erstellen einer eigenen ConfigSection geschrieben – im Grunde nutzen wir jetzt fast dieselbe Config. Zur Laufzeit? Startet […]

  • image.png
    HowTo: RSS Feeds mit ASP.NET MVC erstellen

    Ich hatte hier schon öfters geschrieben wie man RSS oder Atom Feeds konsumieren kann – jetzt geht es aber mal um das erstellen bzw. publishen eines eigenen Feeds. Trotz des Alters von den Feed Standards und die vielen Abgesänge von Facebook, Twitter und Google auf RSS/Atom halte ich diese einfach zu konsumierende API für ziemlich […]

Support us!