web-dev-qa-db-de.com

Wahl zwischen DTD und XSD

Ich möchte entweder eine DTD oder eine XSD verwenden, um mein XML-Dokument zu beschreiben. Ich habe gelesen, dass XSDs besser sind als DTDs, da sie Namespaces und Datentypen unterstützen und dass DTDs älter sind.

Bedeutet das, dass ich XSDs nur für alle zukünftigen Anforderungen verwenden und DTD als Option vollständig ignorieren sollte? Sollte ich überhaupt die Struktur der DTDs lernen?

Welche Faktoren sollte ich bei der Wahl zwischen XSD und DTD beachten?

48
ajsie

Es ist wahrscheinlich wichtig, DTDs als separate Übung zu erlernen, nur um zu wissen, wie sie funktionieren, falls Sie anderswo auf sie treffen, und um einige der Dinge zu erkennen, die XSD lösen wollte.

Für Ihre derzeitigen Zwecke der Beschreibung eines XML-Dokuments sollten Sie sich jedoch an XSDs halten. 

Sie verfügen nicht nur über ein umfangreicheres Feature-Set (wie Sie bereits erwähnen, einschließlich Datentypen und Namespaces), sondern auch selbst XML-Dokumente, was sehr nützlich sein kann. Da es sich um XML handelt, können Sie deren Form und Gültigkeit viel einfacher überprüfen. Außerdem können Sie Code schreiben, der wie normale XML-Dateien funktioniert (wenn Sie beispielsweise Code-Klassen aus einem Schema automatisch generieren möchten).

45
Mike Mooney

Es hängt wirklich davon ab, wie kompliziert die Struktur ist, die Sie einrichten müssen.

Wenn Sie Dinge wie Namespacing und Datentypen benötigen, sollten Sie sich auf jeden Fall für XSD entscheiden. Wenn Sie nur ein kurzes kleines Schema benötigen, mit dem Sie nachprüfen können, führt die DTD zu einer schnelleren Leistung, da keine XML-Analyse erforderlich ist.

Nach meinem Verständnis ist XSD von DTD abgeleitet, sodass das Verständnis von DTD eine solide Grundlage für das Erlernen von XSD bietet und auf einige Mängel von DTD hinweist. 

7
Brant

Es würde nicht schaden, die Struktur einer DTD zu verstehen (es wird Ihnen helfen, eine XSD auf lange Sicht besser zu verstehen) ... aber Sie sollten XSDs verwenden, um vorwärts zu kommen.

5
Justin Niessner

Kein Schaden beim Erlernen der DTD, aber verwenden Sie XSD, da XSD mehr Kraft hat.

Mit XSD können Sie nicht nur die Struktur/Hierarchie der XML-Tags überprüfen, sondern auch

  1. Sie können den Datentyp der Werte der Knoten definieren. [Datum, Nummer, Zeichenfolge usw.]
  2. Sie können auch benutzerdefinierte Datentypen definieren. [Beispiel für Knoten . Die möglichen Daten können Einer der 12 Monate sein. Sie müssen Definieren alle 12 Monate in einem neuen - Datentyp, der alle 12-monatigen Namen als Aufzählungswerte schreibt. Die Validierung zeigt einen Fehler, wenn die Eingabe XML anderer Wert als diese 12 Werte ..]
  3. Sie können die Einschränkung für das Vorkommen von Der Elemente festlegen. Verwenden Sie MinOccurs und maxOccurs. Die Standardwerte für Sind 1 und 1.

.. und viele mehr ... 

Es gibt einige Einschränkungen: wie,

  1. Ein in der XSD-Datei Definiertes Element (Name) muss nur mit einem Datentyp definiert sein.
  2. Sie können einen Knoten/ein Attribut Nicht mit dem Wert eines anderen Knotens/Attributs überprüfen.
5

Dies ist eine alte Zeichenfolge, ABER falls irgendjemand anders auf sie stößt ... was DTD noch sagen kann, hat zwei Vorteile, die XSD nicht bietet: Die Entity-Funktion, die in XSD nicht vorhanden ist. Dies ist eine ziemlich beeindruckende Funktion, die dem Compiler mitteilt, wie potenziell unbekannte Dateitypen verarbeitet werden können, indem er die zu öffnenden Programme identifiziert. 

DTDs werden auch in die XML-Spezifikation geschrieben, sodass sie direkt in XML-Dokumente geschrieben werden können, während XSD als externe Datei vorhanden und verbunden sein muss. Dies ist vor allem bei großen Dokumenten ohnehin keine große Sache.

Ich denke, XSD ist immer noch viel besser und natürlicher, da es XML-Syntax verwendet. Ich wollte nur den Advocate des Teufels spielen :)

2
Joel

Es ist ein IMHO-Thema, das sehr wichtig ist, um eine DTD zu verwenden (möglicherweise zusammen mit einer XSD, wenn Sie eine gründliche Validierung benötigen):

In der DTD können Sie eigene Entitäten definieren, zB:

<!ENTITY MyName "DrDr.Hannibal Xerxes Utah,MBA and CEO">

In Ihrem Dokument können Sie, wo immer es nötig ist, einfach den Code & MyName; Statt all dieses Zeug zu tippen.

Angenommen, Sie haben eine XML-ähnliche Datei (die möglicherweise von einer anderen Anwendung erzeugt wird), die aus vielen ähnlichen Tags besteht, jedoch kein Root-Tag, z.

<?xml version="1.0" encoding="ISO-8859-1"?> <!-- you need this when using foreign characters like 'ü' -->
<Book Author="Author1">
  <Titel>Erstes Buch</Titel>
</Book>
...
<Book Author="Author5">
  <Titel>Fünftes Buch</Titel>
</Book>

Angenommen, diese Datei hat den Namen "Booklist.TXT".

Jetzt können Sie Ihren Master-XML-Code kodieren:

<?xml version="1.0" encoding="ISO-8859-1"?> <!-- you need this when using foreign characters like 'ü' -->
<DOCTYPE MyRoot [
<ENTITY AllBooks SYSTEM "Booklist.TXT">
]

<MyRoot>
... some prefix-stuff as needed ...
&AllBooks; <!-- here are all the Books -->
... some post stuff es needed ...
</MyBook>

wenn Sie die Bücher in einem anderen Kontext benötigen, müssen Sie lediglich die umgebende XML-Datei kodieren und müssen die Buchliste selbst nicht berühren oder kopieren. Außerdem können Sie sie an einem einzigen Ort verwalten und alle Änderungen in einem Dokument vornehmen.

2
MikeTheGuru

XML Schema kann komplexere Überprüfungen durchführen. Z. B. wenn DTD prüft, dass der Datentyp eines XML-Elements eine Ganzzahl oder eine Zeichenfolge ist. Das XML-Schema kann kompliziertere Überprüfungen durchführen, z. B. wenn das XML-Element eine Zeichenfolge ist, die mit einem Großbuchstaben oder einer positiven Ganzzahl beginnt. Schließlich verwendet das XML-Schema die XML-Syntax und ist eine natürliche Wahl für die Entwicklung von Web-Services.

0
Rohit Goyal