In der Datenbank befinden sich derzeit 477 Specials. Alle Specials anzeigen... |
Typfragen | |
Typfragen
Solche Dinge werden in einer Document Type Definition, kurz DTD
festgelegt. Eine DTD listet alle Elemente, Attribute und Entities, die in Eurem XML-Dokument vorkommen
dürfen, und den Kontext, in dem sie benutzt werden. Eure XML-Dokumente müssen nicht alles
enthalten, was in der DTD definiert ist, aber alles, was sie enthalten, muß in der DTD definiert sein.
Wenn ein XML-Dokument eine DTD besitzt und dieser nicht widerspricht, ist das Dokument
gültig (englisch 'valid').
<!DOCTYPE book SYSTEM "comics.dtd"> Nach dem Schlüsselwort DOCTYPE folgt das Wurzelelement, das verwendet werden soll (in diesem Fall 'book', anschließend das Schlüsselwort SYSTEM, danach der Pfad zur DTD. In unserem Fall liegt 'comics.dtd' im gleichen Verzeichnis, Ihr könnt aber auch eine absolute URL angeben. Wenn wir unser Beispieldokument dieser DTD unterwerfen wollen, sähe das so aus <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?> <!DOCTYPE book SYSTEM "comics.dtd"> <book> <name>Der coole Comic</name> <number>1234-5</number> <prize currency="euro">5,99</prize> </product> Mit XML definierte Sprachen wie XHTML, MathML, SVG oder RDF werden Euch in Form eben einer solchen DTD zur Verfügung gestellt, gegen die Ihr Eure Dokumente validieren (auf Gültigkeit prüfen) könnt. In den meisten Fällen liegen diese DTDs auf Servern irgendwo im Internet, und Ihr müßtet den genauen Pfad in die DOCTYPE-Angabe schreiben. Aber die kennt Ihr nicht immer, und außerdem soll die Validierung möglichst auch offline ohne Kontakt zum Server funktionieren. Das könnt Ihr mit Hilfe von sogenannten öffentlichen IDs erreichen. Damit könnt Ihr die gewünschte DTD angeben, auch ohne ihre exakte URL zu kennen. Wo die «richtige» DTD tatsächlich liegt, weiß (hoffentlich) Eurer Validator-Programm. <!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd">
Diese öffentliche ID verweist auf die RSS-DTD (Rich Site Summary), die Netscape standardisiert hat.
Wie Ihr seht, wird das Schlüsselwort SYSTEM durch PUBLIC ersetzt, und anstelle der exakten URL wird
ein Identifikationsstring angegeben. Wie der genau aussehen muß, sollte in der Dokumentation
der gewünschten DTD stehen. In unserem Beispiel ist zusätzlich die exakte URL (auf dem
Netscape-Server) ebenfalls angegeben. Falls der Validator mit dem Identifikationsstring doch nichts
anzufangen weiß oder die passende DTD lokal nicht vorliegt, wird versucht, sie von der angegebenen
URL zu holen. Für Eure selbstgeschriebenen DTDs braucht Ihr keine öffentlichen IDs; hier
könnt Ihr ja selbst dafür sorgen, daß die *.dtd-Datei an der angegebenen URL zu finden ist.
Außerdem gibt es einige Editoren (speziell für XML oder allgemeine Texteditoren), die XML-Dokumente validieren können
Einige Editoren stellen die Validität Eures Dokuments auf andere Art sicher: Sie erlauben (mittels
Drop-Down-Menu) nur das Einfügen solcher Elemente, die die DTD an dieser Stelle gestattet. Solch
ein Editor ist beispielsweise Xerlin (früher als Merlot
bekannt, ebenfalls ein Java-Programm).
<!ELEMENT name inhalt> Um festzulegen, daß in einem book-Element nur genau ein 'name'-Element stehen darf, schreibt Ihr also <!ELEMENT book name> Wenn in Eurem Element mehrere Elemente enthalten sein sollen, könnt Ihr diese inneren Elemente einfach aufzählen <!ELEMENT book (name, number, prize)> Mit dieser Festlegung muß jedes book-Element genau ein name-Element, ein number-Element und ein prize-Element enthalten, in genau dieser Reihenfolge. Sogenannte Quantifier erlauben es Euch festzulegen, wie oft ein inneres Element vorkommen darf oder muß. Dabei steht
Wenn Ihr beispielsweise mehrere prize-Elemente (in verschiedenen Währungen) erlauben wollt, kann das so aussehen <!ELEMENT book (name, number, prize+)> Ein leeres Element definiert Ihr mit dem Schlüsselwort EMPTY <!ELEMENT br EMPTY> Wenn Ihr verschiedene Möglichkeiten offenlassen wollt, könnt Ihr mit dem Operator | arbeiten <!ELEMENT autoren (zeichner* | texter*)> Ein autoren-Element kann also entweder eine beliebige Anzahl an zeichner-Elementen oder eine beliebige Anzahl an texter-Elementen enthalten. Nicht ohne Grund erinnert der Operator an den ||-Operator aus verschiedenen Programmiersprachen. Allerdings funktioniert diese Definition noch nicht so, wie wir uns das vorstellen: Sie akzeptiert auch kein zeichner-Element und kein texter-Element in 'autoren', also ein leeres autoren-Element. Besser ist <!ELEMENT autoren ((zeichner+, texter*) | (texter+, zeichner*))> Diese Definition erlaubt entweder mindestens ein zeichner-Element und beliebig viele texter-Elemente oder mindestens ein texter-Element und beliebig viele zeichner-Elemente. Daran könnt Ihr auch sehen, daß Ihr in einer Inhaltsdefinition mehr oder weniger beliebig klammern und verschachteln könnt. Auch die Quantifier könnt Ihr auf Klammern anwenden <!ELEMENT sammlung (serie, heftnummer)+> 'sammlung' kann also eine oder mehrere Folgen, bestehend aus einem serie-Element und einem heftnummer-Element, aufnehmen. Nachdem Ihr die Folge von Elementen und Kindselementen durchdekliniert habt, kommt Ihr natürlich irgendwann zu Elementen, die einfach nur Text enthalten sollen. Dazu gibt es das Schlüsselwort #PCDATA <!ELEMENT zeichner #PCDATA> Eine Einschränkung muß ich noch erwähnen: Wenn ihr sogenannte gemischte Elemente deklarieren wollt, die sowohl #PCDATA als auch Kindselemente enthalten, könnt Ihr nur eine Folge mit #PCDATA und den Kindselementen deklarieren <!ELEMENT gemischt (#PCDATA|kind1|kind2|kind3)*>
#PCDATA muß an erster Stelle stehen, und weitere Verschachtelungen sind nicht möglich.
<!ATTLIST elementname attribut typ attribut2 typ attribut3 typ> Ein Beispiel für eine Attribut-Deklaration ist <!ATTLIST prize currency CDATA #REQUIRED contains_taxes (yes|no)>
Jedes prize-Element muß also ein currency-Attribut besitzen (das «muß» legt das
Schlüsselwort #REQUIRED fest) und kann ein contains_taxes-Attribut haben. Dabei kann das
currency-Attribut beliebige in einem XML-Dokument erlaubte Zeichen enthalten, das
contains_taxes-Attribut einen der Werte «yes» oder «no». Es gibt noch einige
weitere Typen für Attribute, auf die ich hier aber nicht weiter eingehen werde, da Ihr fast alles mit
CDATA und Aufzählungen (wie bei contains_taxes) realisieren könnt.
Weitere Entities könnt Ihr selbst definieren. Um beispielsweise nicht jedesmal «ABComics & Co. Ltd.» tippen zu müssen, definiert Ihr in Eurer DTD <!ENTITY abc "ABComics &Co. Ltd.">
Diese Entity könnt Ihr dann in Eurem XML-Dokument als &abc; verwenden. Der Text, der anstelle
der Entitiy eingesetzt wird (hier «ABComics & Co. Ltd.»), muß wohlgeformt sein
(darf also auch Tags enthalten). Er darf seinerseits Entities enthalten, solange sich kein
«Kreisschluß» ergibt.
|
Special vom: | 16.01.2003 |
Autor dieses Specials: | Henning Kockerbeck |
Die weiteren Unterseiten dieses Specials: | |
Die reine Lehre - HTML | |
Stilvoll - CSS | |
Kleiner Grundkurs Programmieren | |
Jetzt wird's dynamisch - JavaScript | |
Die andere Seite der Dynamik - PHP | |
Neue Gefilde - XML | |
Weiterführende Links | |
Zurück zur Hauptseite des Specials |