que - dtd xml
¿Cuál es la diferencia entre XML Schema y DTD? (12)
Similitudes entre XSD y DTD
both specify elements, attributes, nesting, ordering, #occurences
Diferencias entre XSD y DTD
XSD also has data types, (typed) pointers, namespaces, keys and more.... unlike DTD
Además, aunque XSD es poco detallado, su sintaxis es la extensión de XML, por lo que es conveniente aprender rápido.
He buscado esta pregunta en Google, pero no entiendo claramente qué es un esquema XML y DTD (definición de tipo de documento), y por qué el esquema XML es más poderoso en comparación con DTD.
Cualquier orientación sería muy apreciada.
Como muchas personas han mencionado anteriormente, XML Schema utiliza una sintaxis basada en XML y las DTD tienen una sintaxis única. DTD no admite tipos de datos, lo que sí importa.
Veamos un ejemplo muy simple en el que la universidad tiene múltiples estudiantes y cada alumno tiene dos elementos, "nombre" y "año". Tenga en cuenta que tengo usos "// ->" en mi código solo para comentarios.
Ahora voy a escribir este ejemplo tanto en DTD como en XSD.
DTD
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE university[ // --> university as root element
<!ELEMENT university (student*)> // --> university has * = Multiple students
<!ELEMENT student (name,year)> // --> Student has elements name and year
<!ELEMENT name (#PCDATA)> // --> name as Parsed character data
<!ELEMENT year (#PCDATA)> // --> year as Parsed character data
]>
<university>
<student>
<name>
John Niel //---> I can also use an Integer,not good
</name>
<year>
2000 //---> I can also use a string,not good
</year>
</student>
</university>
Definición de esquema XML (XSD)
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name ="uniType"> //--> complex datatype uniType
<xsd:sequence>
<xsd:element ref="student" maxOccurs="unbounded"/> //--> has unbounded no.of students
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="stuType"> //--> complex datatype stuType
<xsd:sequence>
<xsd:element ref="name"/> //--> has element name
<xsd:element ref="year"/> //--> has element year
</xsd:sequence>
</xsd:complexType>
<xsd:element name="university" type="uniType"/> //--> university of type UniType
<xsd:element name="student" type="stuType"/> //--> student of type stuType
<xsd:element name="name" type="xsd:string"/> //--> name of datatype string
<xsd:element name="year" type="xsd:integer"/> //--> year of datatype integer
</xsd:schema>
<?xml version="1.0" encoding="UTF-8"?>
<university>
<student>
<name>
John Niel
</name>
<year>
2000 //--> only an Integer value is allowed
</year>
</student>
</university>
Cuando XML apareció por primera vez, nos dijeron que resolvería todos nuestros problemas: XML será fácil de usar, infinitamente extensible, evitará tipeo fuerte y no requerirá ninguna habilidad de programación. Aprendí acerca de las DTD y escribí mi propio analizador XML. Más de 15 años después, veo que la mayoría de XML no es fácil de usar y no es muy extensible (según su uso). Tan pronto como algunos zuecos inteligentes conectaron XML a una base de datos, supe que los tipos de datos eran casi inevitables. Y debería ver el XSLT (archivo de transformación) en el que tuve que trabajar el otro día. Si eso no es programación, ¡no sé lo que es! Hoy en día no es inusual ver todo tipo de problemas relacionados con los datos XML o las interfaces que fallaron. Me encanta XML, pero se ha alejado mucho de su punto de partida altruista original.
La respuesta corta? Las DTD han quedado obsoletas a favor de XSD porque un XSD le permite definir una estructura XML con más precisión.
DTD es anterior a XML y, por lo tanto, no es un XML válido en sí mismo. Esa es probablemente la razón más importante para la invención de XSD.
DTD está prácticamente obsoleto porque tiene una utilidad limitada como lenguaje de esquema, no admite espacio de nombres y no admite el tipo de datos. Además, la sintaxis de DTD es bastante complicada, lo que dificulta su comprensión y mantenimiento.
DTD indica la sintaxis del elemento XML
Los esquemas XML son la alternativa de Microsoft a la DTD para validar XML
DTD puede tener solo dos tipos de datos, el CDATA y el PCDATA. Pero en un esquema puede usar todo el tipo de datos primitivos que usa en el lenguaje de programación y tiene la flexibilidad de definir sus propios tipos de datos personalizados.
El desarrollador que crea un esquema puede crear tipos de datos personalizados en función de los tipos de datos básicos y utilizando diferentes operadores y modificadores.
Desde las diferencias entre las DTD y la sección Esquema de Converting a DTD en un artículo de Schema :
La diferencia fundamental entre las DTD y el Esquema XML es que XML Schema utiliza una sintaxis basada en XML, mientras que las DTD tienen una sintaxis única retenida de las DTD SGML. Aunque las DTD a menudo son criticadas debido a esta necesidad de aprender una nueva sintaxis, la sintaxis en sí misma es bastante escueta. Lo contrario es cierto para XML Schema, que son detallados, pero también hacen uso de etiquetas y XML para que los autores de XML encuentren la sintaxis del esquema XML menos intimidante.
El objetivo de las DTD era mantener un nivel de compatibilidad con SGML para las aplicaciones que podrían querer convertir las DTD SGML en DTD XML. Sin embargo, para cumplir con uno de los objetivos de XML, "la concisión en el marcado XML es de importancia mínima", no hay una preocupación real por mantener el resumen de la sintaxis.
[...]
Entonces, ¿cuáles son algunas de las otras diferencias que podrían ser especialmente importantes cuando estamos convirtiendo una DTD? Vamos a ver.
Mecanografía
La diferencia más significativa entre las DTD y el Esquema XML es la capacidad de crear y usar tipos de datos en Schema junto con declaraciones de elementos y atributos. De hecho, es una diferencia tan importante que la mitad de la Recomendación sobre esquemas XML está dedicada a la creación de tipos de datos y al Esquema XML. Cubrimos los tipos de datos en detalle en la Parte III de este libro, "Tipos de datos de esquemas XML".
[...]
Restricciones de ocurrencia
Otra área donde las DTD y el Esquema difieren significativamente es con las limitaciones de ocurrencia. Si recuerda de nuestros ejemplos anteriores en el Capítulo 2, "Estructura de esquema" (o su propio trabajo con DTD), hay tres símbolos que puede usar para limitar el número de apariciones de un elemento: *, + y?.
[...]
Enumeraciones
Entonces, digamos que teníamos un elemento, y queríamos poder definir un atributo de tamaño para la camisa, lo que permitía a los usuarios elegir un tamaño: pequeño, mediano o grande. Nuestra DTD se vería así:
<!ELEMENT item (shirt)> <!ELEMENT shirt (#PCDATA)> <!ATTLIST shirt size_value (small | medium | large)>
[...]
Pero, ¿y si quisiéramos que el
size
fuera un elemento? No podemos hacer eso con una DTD. Las DTD no proporcionan enumeraciones en el contenido de texto de un elemento. Sin embargo, debido a los tipos de datos con Schema, cuandosimpleType
la enumeración en el ejemplo anterior, realmente creamos unsimpleType
llamadosize_values
que ahora podemos usar con un elemento:
<xs:element name="size" type="size_value">
[...]
Las diferencias entre una definición de esquema XML (XSD) y definición de tipo de documento (DTD) incluyen:
- Los esquemas XML se escriben en XML mientras que los DTD se derivan de la sintaxis SGML.
- Los esquemas XML definen tipos de datos para elementos y atributos, mientras que DTD no admite tipos de datos.
- Los esquemas XML admiten el uso de espacios de nombres, mientras que DTD no.
- Los esquemas XML definen el número y el orden de los elementos secundarios, mientras que DTD no.
- Los esquemas XML se pueden manipular por su cuenta con XML DOM, pero no es posible en el caso de DTD.
- Al usar el esquema XML, el usuario no necesita aprender un nuevo idioma, pero trabajar con DTD es difícil para un usuario.
- El esquema XML proporciona una comunicación de datos segura, es decir, el remitente puede describir los datos de una manera que el receptor pueda entender, pero en el caso de los datos DTD, el receptor puede malinterpretarlos.
- Los esquemas XML son extensibles mientras que DTD no es extensible.
ACTUALIZACIÓN : 2015.08.26
No todas estas viñetas son 100% precisas, pero obtienes la esencia.
Por otra parte:
- DTD le permite definir nuevos valores ENTITY para usar en su archivo XML.
- DTD te permite extenderlo localmente a un archivo XML individual.
Una diferencia es también que en una DTD, el modelo de contenido de un elemento está completamente determinado por su nombre, independientemente de dónde aparezca en el documento. Por lo tanto, supongamos que desea tener un elemento hijo de name
de su elemento person
que tenga elementos secundarios first
y last
. Luego, si desea tener un elemento hijo de name
para un elemento de city
en el mismo documento, también debería tener elementos secundarios first
y last
. Por el contrario, XML Schema le permite declarar los tipos de elementos secundarios localmente, por lo que en este caso podría declarar los elementos secundarios name
para la person
y la city
separado, dándoles sus propios modelos de contenido en esos contextos.
La otra gran diferencia es el soporte para espacios de nombres. Dado que las DTD son parte de la especificación XML original (y heredada de SGML), no son conscientes del espacio de nombres porque los espacios de nombres XML se especificaron más adelante. Puede usar DTDs en combinación con espacios de nombres, pero requiere algunas contorsiones, como forzarse a definir los prefijos en la DTD y usar solo esos prefijos, en lugar de poder usar prefijos arbitrarios.
Para mí, otras diferencias son en su mayoría superficiales. El soporte de tipo de datos se puede agregar fácilmente a las DTD, y la sintaxis es solo la sintaxis. (Yo, por ejemplo, encuentro la sintaxis del Esquema XML horrible y nunca querría mantener a mano un Esquema XML, que no diría sobre los DTD o los esquemas RELAX NG; si necesito un Esquema XML por alguna razón, suelo escribir un RELAX NG one y trang
con trang
.)
XML DTD
El objetivo de una DTD es definir la estructura de un documento XML. Define la estructura con una lista de elementos legales:
<!ATTLIST contact type CDATA #IMPLIED>
<!ELEMENT address1 ( #PCDATA)>
<!ELEMENT city ( #PCDATA)>
<!ELEMENT state ( #PCDATA)>
<!ELEMENT zip ( #PCDATA)>
Esquema XML
El esquema XML permite a los autores del esquema especificar que los datos de cantidad de elementos deben ser numéricos o, incluso más específicamente, un entero. En el siguiente ejemplo usé string:
<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="address1" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="state" type="xs:string"/>
<xs:element name="zip" type="xs:string"/>
</xs:sequence>
</xs:complexType>
Semejanzas
Los DTD y los Esquemas realizan las mismas funciones básicas:
- Primero, ambos declaran una lista de elementos y atributos.
- Segundo, ambos describen cómo esos elementos están agrupados, anidados o usados dentro del XML. En otras palabras, declaran las reglas mediante las cuales permite que alguien cree un archivo XML dentro de su flujo de trabajo, y
- En tercer lugar, tanto las DTD como los esquemas proporcionan métodos para restringir o forzar el tipo o formato de un elemento. Por ejemplo, dentro de DTD o Schema puede forzar que un campo de fecha se escriba como 01/05/06 o 1/5/2006.
Diferencias
Las DTD son mejores para aplicaciones de texto intensivo, mientras que los esquemas tienen varias ventajas para flujos de trabajo intensivos en datos.
Los esquemas están escritos en XML y, por lo tanto, siguen las mismas reglas, mientras que los DTD están escritos en un lenguaje completamente diferente.
Ejemplos:
DTD:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT employees (Efirstname, Elastname, Etitle, Ephone, Eemail)>
<!ELEMENT Efirstname (#PCDATA)>
<!ELEMENT Elastname (#PCDATA)>
<!ELEMENT Etitle (#PCDATA)>
<!ELEMENT Ephone (#PCDATA)>
<!ELEMENT Eemail (#PCDATA)>
XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:od="urn:schemas-microsoft-com:officedata">
<xsd:element name="dataroot">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="employees" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="generated" type="xsd:dateTime"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="employees">
<xsd:annotation>
<xsd:appinfo>
<od:index index-name="PrimaryKey" index-key="Employeeid " primary="yes"
unique="yes" clustered="no"/>
<od:index index-name="Employeeid" index-key="Employeeid " primary="no" unique="no"
clustered="no"/>
</xsd:appinfo>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Elastname" minOccurs="0" od:jetType="text"
od:sqlSType="nvarchar">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="50"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="Etitle" minOccurs="0" od:jetType="text" od:sqlSType="nvarchar">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="50"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="Ephone" minOccurs="0" od:jetType="text"
od:sqlSType="nvarchar">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="50"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="Eemail" minOccurs="0" od:jetType="text"
od:sqlSType="nvarchar">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="50"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="Ephoto" minOccurs="0" od:jetType="text"
od:sqlSType="nvarchar">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="50"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>