web-dev-qa-db-fra.com

Comment choisir entre DTD et XSD

Je souhaite utiliser une DTD ou un XSD pour décrire mon document XML. J'ai lu que les XSD sont meilleurs que les DTD car ils supportent les espaces de noms et les types de données, et que les DTD sont plus anciennes.

Est-ce que cela signifie que je ne devrais utiliser que les XSD pour tous les besoins futurs et ignorer totalement la DTD en tant qu'option? Devrais-je même prendre la peine d'apprendre la structure des DTD?

Quels facteurs dois-je prendre en compte lors du choix entre XSD et DTD?

48
ajsie

Il est probablement important d’apprendre les DTD séparément, juste pour savoir comment elles fonctionnent, au cas où vous les rencontriez quelque part, et pour pouvoir apprécier certaines des choses que XSD essayait de résoudre.

Toutefois, pour décrire votre document XML, vous vous en tenez aux XSD. 

En plus d'avoir un ensemble de fonctionnalités bien plus riche (comme vous l'avez mentionné, y compris les types de données et les espaces de noms), ce sont également des documents XML, ce qui peut s'avérer très utile. Comme ils sont au format XML, vous pouvez vérifier leur qualité et leur validité beaucoup plus facilement et vous pouvez écrire du code qui fonctionne avec eux comme des fichiers XML normaux (par exemple, si vous souhaitez générer automatiquement des classes de code à partir d'un schéma)

45
Mike Mooney

Cela dépend vraiment de la complexité de la structure à configurer.

Si vous avez besoin d'éléments tels que l'espacement de noms et les types de données, optez pour XSD. Si vous avez juste besoin d'un petit schéma rapide à vérifier, DTD vous donnera des performances plus rapides car aucune analyse XML n'est impliquée.

Si je comprends bien, XSD étant dérivé de DTD, la compréhension de cette dernière donnera une base solide pour l’apprentissage de la XSD. 

7
Brant

Comprendre la structure d'une DTD ne vous ferait pas de mal (cela vous aidera à mieux comprendre un XSD à long terme) ... mais vous devriez utiliser les XSD à l'avenir.

5
Justin Niessner

Pas de mal à apprendre la DTD, mais assurez-vous d'utiliser XSD, car XSD a plus de force,

Avec XSD, vous pouvez non seulement valider la structure/hiérarchie des balises XML, mais aussi,

  1. Vous pouvez définir le type de données des valeurs Des nœuds. [date, numéro, chaîne, etc.]
  2. Vous pouvez également définir custom Data_types, [exemple, pour le noeud , Les données possibles peuvent êtreun des 12 mois .. de sorte que vous ayez besoinpour définir tous les 12 mois dans un nouveau. Le type __.data écrivant tous les noms de mois de 12 mois sous forme de valeurs d'énumération .. validation indique une erreur si l'entrée XML contient une valeur autre que ces 12 valeurs ..]
  3. Vous pouvez définir la restriction sur l'occurrence Des éléments en utilisant MinOccurs et maxOccurs. Les valeurs par défaut de Sont 1 et 1.

.. et beaucoup plus ... 

Il y a quelques restrictions: comme,

  1. Un élément (nom) défini dans le fichier XSD Doit être défini avec un seul type de données.
  2. Vous ne pouvez pas valider un nœud/attribut En utilisant la valeur d'un autre nœud/attribut
5

Ceci est une vieille chaîne, MAIS au cas où quelqu'un d'autre la trouverait ... D'après ce que je peux dire, DTD a toujours deux avantages que XSD n'a pas, à savoir l'inclusion de la fonction ENTITY qui n'existe pas dans XSD. Il s'agit d'une fonctionnalité assez géniale qui indique au compilateur comment traiter les types de fichiers potentiellement inconnus en identifiant les programmes à ouvrir pour les traiter. 

De plus, les DTD sont écrites dans la spécification XML afin de pouvoir être écrites directement dans des documents XML alors que XSD doit exister en tant que fichier externe et connecté. Ce n'est pas grave, surtout si vous utilisez de gros documents.

Je pense que XSD est encore bien meilleur et plus naturel puisqu'il utilise la syntaxe XML, je voulais juste me faire l'avocat du diable :)

2
Joel

Il existe un problème très important à mon humble avis concernant l’utilisation d’une DTD (peut-être avec un XSD si vous avez besoin d’une validation approfondie):

Dans DTD, vous pouvez définir vos propres entités, par exemple:

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

Dans votre document, vous pouvez, où que vous soyez, simplement coder & MyName; au lieu de taper tous ces trucs.

De plus, supposons que vous ayez un fichier de type XML (peut-être produit par une autre application) qui contient beaucoup de balises similaires mais pas de balise racine, par exemple:

<?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>

Supposons que ce fichier s'appelle "Booklist.TXT",

Maintenant, vous pouvez coder votre master-xml:

<?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>

et chaque fois que vous avez besoin des livres dans un autre contexte, vous devez uniquement coder le code XML environnant et ne pas toucher ou copier la liste de livres elle-même. De plus, vous pouvez la conserver à un endroit unique et modifier tous les documents.

2
MikeTheGuru

Le schéma XML peut effectuer des validations plus complexes. E.g si DTD vérifie que le type de données d’un élément XML est un entier ou une chaîne. Le schéma XML peut effectuer des validations plus complexes, comme si l’élément xml est une chaîne commençant par une lettre majuscule ou un entier positif. Enfin, le schéma XML utilise la syntaxe XML et constitue un choix naturel pour le développement de services Web.

0
Rohit Goyal