2010-03-05 41 views
47

Deseo usar una DTD o una XSD para describir mi documento XML. He leído que los XSD son mejores que los DTD ya que admiten espacios de nombres y tipos de datos, y que los DTD son más antiguos.Cómo elegir entre DTD y XSD

¿Esto significa que solo debería usar XSD para todas las necesidades futuras e ignorar totalmente la DTD como una opción? ¿Debería incluso molestarme en aprender la estructura de las DTD?

¿Qué factores debo considerar al elegir entre XSD y DTD?

+1

superposición grande con la pregunta vs.: http://stackoverflow.com/questions/1544200/what-is-difference-between-xml-schema-and-dtd –

Respuesta

44

Probablemente sea importante aprender DTD como un ejercicio separado, solo por el conocimiento de cómo funcionan en caso de que los encuentre en otro lugar, y para que pueda apreciar algunas de las cosas que XSD estaba tratando de resolver.

Sin embargo, para su propósito actual de describir un documento XML, de hecho se adhieren a los XSD.

Además de tener un conjunto de funciones mucho más rico (como usted menciona, incluidos los tipos de datos y espacios de nombres), también son documentos XML en sí mismos, que pueden ser realmente útiles. Debido a que son XML, puede verificar mucho mejor su buena formación y validez, y puede escribir código que funcione con ellos como archivos XML normales (por ejemplo, si desea autogenerar clases de código desde un esquema)

+0

Buena respuesta informativa corta: la frase me hizo preguntarme algo : 'Debido a que son XML [...] puede comprobar su [validez] mucho más fácil': curiosamente, la forma en que lo hace parece depender del estándar DTD - http://www.w3.org/2001/ XMLSchema.dtd – monojohnny

+2

Lo que quiero decir es que un XSD en sí mismo es un documento XML válido, por lo que puede abrirlo en XmlDocument o lo que sea y analizar la información.Las DTD no son XML válidas, por lo que si desea escribir código que lea en el contenido DTD (como un generador de código que crea clases XML), necesita analizar ese formato usted mismo. Estoy seguro de que hay componentes/utilidades para leer archivos DTD, pero XSDs lo proporciona a través de XML (relativamente) fácil de analizar de forma gratuita. –

+2

@monoJohnny - tiene razón en que hay una DTD para los documentos de esquema XSD, pero no es del todo correcto decir que la validación de los documentos de esquema necesariamente depende de las DTD; también hay un esquema XSD para documentos de esquema. La DTD se proporcionó en parte para el arranque (cuando salieron borradores iniciales de XSD, las DTD ya eran ampliamente compatibles) y en parte para fines de comparación (para ayudar a los lectores expertos en DTD a comprender el esquema de los documentos de esquema). –

5

No estaría de más entender la estructura de una DTD (te ayudará a comprender mejor una XSD a largo plazo) ... pero deberías usar XSDs en el futuro.

7

Realmente depende de qué tan complicada es la estructura que necesita configurar.

Si necesita cosas como namespacing y tipos de datos, definitivamente vaya con XSD. Si solo necesita un esquema pequeño y rápido para verificar, DTD le dará un rendimiento más rápido ya que no hay análisis XML involucrado.

Según tengo entendido, XSD se deriva de DTD por lo que entender DTD proporcionará una base sólida para aprender XSD, además de señalar algunos de los defectos de DTD.

5

no hay daño en el aprendizaje de DTD, pero asegúrese de usar XSD, porque XSD tiene más fuerza,

con XSD no sólo se puede validar la estructura/jerarquía de las etiquetas XML, sino también,

  1. puede definir Tipo de datos de los valores de los nodos. [Fecha, número, cadena, etc]
  2. También puede definir personalizados data_types, [ejemplo, para el nodo , los datos pueden ser posibles uno de los 12 meses .. por lo que necesita para definir todos los 12 meses de un nuevo tipo de datos escribir todos los nombres de 12 meses como valores de enumeración .. validación muestra un error si el XML de entrada contiene cualquier otro valor que estos 12 valores ..]
  3. puede poner la restricción a la ocurrencia de los elementos, usando minOccurs y maxOccurs, el valor predeterminado v alues ​​son 1 y 1.

.. y muchos más ...

hay algunas restricciones: Como al igual que,

  1. Un elemento (nombre) se define en el archivo XSD se debe definir con sólo un tipo de datos.
  2. No se puede validar un nodo/atributo utilizando el valor de otro nodo/atributo .
+1

¿Hay alguna función de DTD que no se puede hacer en XSD? –

+2

@dma_k, ninguno! .. –

+0

>> No puede validar un nodo/atributo usando el valor de otro nodo/atributo. ¿Esto significa que no puedo tener dataTypes dinámicos? Por ejemplo, el usuario puede configurar una lista de conexiones de bases de datos en un elemento y usar los nombres de conexión en diferentes elementos (por ejemplo, servicios) y hacer que xsd valide si existe una conexión con el mismo nombre que está configurado dentro del elemento de servicios. – balki

2

Esta es una cadena antigua, PERO en caso de que alguien más se encuentre con ella ... por lo que puedo decir DTD todavía tiene dos beneficios que XSD no tiene, es decir, la inclusión de la función ENTIDAD que no existe en XSD. Esta es una característica bastante impresionante que le dice al compilador cómo procesar tipos de archivos potencialmente desconocidos al identificar qué programas abrir para procesarlos.

Además, las DTD se escriben en la especificación XML para que puedan escribirse directamente en documentos XML, mientras que XSD tiene que existir como un archivo externo y estar conectado. No es un gran problema, especialmente cuando se usa en documentos más grandes de todos modos.

Creo XSD es todavía mucho mejor y más natural, ya que utiliza la sintaxis XML, sólo quería hacer de abogado del diablo :)

+0

se dice [Aquí] (http://stackoverflow.com/questions/1490583/dtd-or-xml-schema-which-one -es-better) que los archivos XSD también pueden estar en línea con los documentos xml, ¿podría explicar más sobre el primer problema? (Inclusión de la función ENTITY) – Shohreh

2

Hay una en mi humilde opinión tema muy importante utilizar una DTD (tal vez junto con un XSD si que necesita en-profundo-validación):

en DTD puede definir sus propias entidades por ejemplo:

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

en el documento se puede wherevever necesaria simplemente código y MiNombre; en lugar de escribir todo esto.

Además suponga que tiene un archivo XML similar (tal vez producido por alguna otra aplicación) que consiste en una gran cantidad de etiquetas similares, pero ninguna raíz en etiquetas, por ejemplo:

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

Asumir este archivo se denomina " Booklist.TXT",

Ahora puede codificar su amo-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> 

y siempre que lo necesite los libros en otro contexto sólo se debe codificar el xml circundante y no habe a t ouch o copie la lista de libros en sí, además puede mantenerla en un solo lugar y tener todos los cambios en cualquier documento.

+1

Ese es un buen punto, pero probablemente cambiaría "(tal vez junto con un XSD si necesita una validación profunda)" a "(tal vez junto con XSD si necesita validación)". Esto se debe a que ninguno de sus ejemplos valida el XML. Son solo declaraciones de entidades en un subconjunto interno. Si se necesita validación, también se necesitaría usar un XSD o se debería suministrar el DTD completo (ya sea externamente o en el subconjunto interno). –

0

XML Schema puede realizar validaciones más complejas. E.g si DTD comprueba que el tipo de datos de un elemento XML es entero o de cadena. El esquema XML puede realizar validaciones más complicadas, como si el elemento xml es una cadena que comienza con una letra mayúscula o un entero positivo. Finalmente, el esquema XML usa la sintaxis XML y es una elección natural para el desarrollo de servicios web.

Cuestiones relacionadas