Câu trả lời:
Từ sự khác biệt giữa phần DTD và Schema trong phần Chuyển đổi DTD thành bài viết Schema :
Sự khác biệt quan trọng giữa DTD và Lược đồ XML là Lược đồ XML sử dụng cú pháp dựa trên XML, trong khi các DTD có một cú pháp duy nhất được giữ từ các DTD SGML. Mặc dù các DTD thường bị chỉ trích vì điều này cần phải học một cú pháp mới, bản thân cú pháp này khá ngắn gọn. Điều ngược lại là đúng đối với Lược đồ XML, dài dòng, nhưng cũng sử dụng các thẻ và XML để các tác giả của XML nên tìm thấy cú pháp của Lược đồ XML ít đáng sợ hơn.
Mục tiêu của các DTD là duy trì mức độ tương thích với SGML cho các ứng dụng có thể muốn chuyển đổi các DTD SGML thành các DTD XML. Tuy nhiên, phù hợp với một trong những mục tiêu của XML, "sự căng thẳng trong đánh dấu XML có tầm quan trọng tối thiểu", không có mối quan tâm thực sự nào với việc giữ cho cú pháp ngắn gọn.
[...]
Vì vậy, một số khác biệt khác có thể đặc biệt quan trọng khi chúng ta chuyển đổi một DTD là gì? Hãy xem nào.
Đánh máy
Sự khác biệt đáng kể nhất giữa DTD và Lược đồ XML là khả năng tạo và sử dụng các kiểu dữ liệu trong Lược đồ kết hợp với khai báo phần tử và thuộc tính. Trên thực tế, đó là một sự khác biệt quan trọng đến nỗi một nửa Khuyến nghị Lược đồ XML được dành cho kiểu dữ liệu và Lược đồ XML. Chúng tôi trình bày chi tiết các kiểu dữ liệu trong Phần III của cuốn sách này, "Các kiểu dữ liệu lược đồ XML."
[...]
Hạn chế xuất hiện
Một lĩnh vực khác mà DTD và Schema khác nhau đáng kể là với các hạn chế xuất hiện. Nếu bạn nhớ lại từ các ví dụ trước của chúng tôi trong Chương 2, "Cấu trúc lược đồ" (hoặc công việc của riêng bạn với DTD), có ba biểu tượng mà bạn có thể sử dụng để giới hạn số lần xuất hiện của một phần tử: *, + và ?.
[...]
Bảng liệt kê
Vì vậy, giả sử chúng ta có một yếu tố và chúng tôi muốn có thể xác định thuộc tính kích thước cho áo, cho phép người dùng chọn kích thước: nhỏ, trung bình hoặc lớn. DTD của chúng tôi sẽ trông như thế này:
<!ELEMENT item (shirt)> <!ELEMENT shirt (#PCDATA)> <!ATTLIST shirt size_value (small | medium | large)>
[...]
Nhưng nếu chúng ta muốn
size
trở thành một yếu tố thì sao? Chúng tôi không thể làm điều đó với một DTD. Các DTD không cung cấp cách liệt kê trong nội dung văn bản của một phần tử. Tuy nhiên, do các kiểu dữ liệu với Schema, khi chúng ta khai báo phép liệt kê trong ví dụ trước, chúng ta thực sự đã tạo ra một cuộcsimpleType
gọisize_values
mà bây giờ chúng ta có thể sử dụng với một phần tử:<xs:element name="size" type="size_value">
[...]
Sự khác nhau giữa Định nghĩa Lược đồ XML (XSD) và Định nghĩa loại tài liệu (DTD) bao gồm:
CẬP NHẬT : 2015,08,26
Không phải tất cả các điểm đạn này đều chính xác 100%, nhưng bạn có được ý chính.
Mặt khác:
Như nhiều người đã đề cập trước đây, Lược đồ XML sử dụng cú pháp dựa trên XML và các DTD có một cú pháp duy nhất. DTD không hỗ trợ kiểu dữ liệu, điều này không thành vấn đề.
Hãy xem một ví dụ rất đơn giản trong đó trường đại học có nhiều sinh viên và mỗi sinh viên có hai yếu tố "tên" và "năm". Xin lưu ý rằng tôi đã sử dụng "// ->" trong mã của mình chỉ để nhận xét.
Bây giờ tôi sẽ viết ví dụ này cả trong DTD và XSD.
ĐTDĐ
<?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>
Định nghĩa lược đồ 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>
DTD có trước XML và do đó không phải là XML hợp lệ. Đó có lẽ là lý do lớn nhất cho phát minh của XSD.
both specify elements, attributes, nesting, ordering, #occurences
XSD also has data types, (typed) pointers, namespaces, keys and more.... unlike DTD
Hơn nữa, mặc dù XSD hơi dài dòng, cú pháp của nó là phần mở rộng của XML, giúp cho việc học nhanh trở nên thuận tiện.
1
, 0 or 1
, 0 or more
, trong khi XSD có thể chỉ định tối thiểu và số lượng tối đa.
Một điểm khác biệt là trong một DTD, mô hình nội dung của một yếu tố hoàn toàn được xác định bởi tên của nó, độc lập với nơi nó xuất hiện trong tài liệu:
Giả sử bạn muốn có
person
yếu tốname
name
chính nó có các yếu tố con first
và last
.Như thế này
<person>
<name>
<first></first>
<last></last>
</name>
</person>
Nếu một city
phần tử trong cùng một tài liệu cũng cần phải có 'tên' một phần tử con DTD đòi hỏi yếu tố 'tên' này phải có phần tử con first
và last
là tốt. Mặc dù thực tế là city.name
không yêu cầu first
và last
như trẻ em.
Ngược lại, Lược đồ XML cho phép bạn khai báo các kiểu phần tử con cục bộ; bạn có thể khai báo các name
phần tử con cho cả hai person
và city
riêng biệt. Do đó cung cấp cho họ các mô hình nội dung phù hợp của họ trong các bối cảnh đó.
Sự khác biệt chính khác là hỗ trợ cho không gian tên. Do các DTD là một phần của đặc tả XML gốc (và được kế thừa từ SGML), nên chúng hoàn toàn không nhận biết được không gian tên vì các không gian tên XML đã được chỉ định sau. Bạn có thể sử dụng các DTD kết hợp với các không gian tên, nhưng nó đòi hỏi một số mâu thuẫn, như bị buộc phải xác định các tiền tố trong DTD và chỉ sử dụng các tiền tố đó, thay vì có thể sử dụng các tiền tố tùy ý.
Đối với tôi, sự khác biệt khác chủ yếu là bề ngoài. Hỗ trợ kiểu dữ liệu có thể dễ dàng được thêm vào DTD và cú pháp chỉ là cú pháp. (Tôi, trước hết, thấy cú pháp Lược đồ XML thật kinh khủng và sẽ không bao giờ muốn duy trì một Lược đồ XML, mà tôi sẽ không nói về các lược đồ DTD hoặc RELAX NG; vì tôi cần viết một Lược đồ XML vì một số lý do, tôi thường viết một tin cậy NG một và chuyển đổi nó với trang
.)
Điểm tương đồng :
Cả DTD và Lược đồ đều thực hiện các chức năng cơ bản giống nhau:
Sự khác biệt:
DTD tốt hơn cho các ứng dụng sử dụng nhiều văn bản, trong khi các lược đồ có một số lợi thế cho quy trình làm việc chuyên sâu về dữ liệu.
Các lược đồ được viết bằng XML và do đó tuân theo các quy tắc tương tự, trong khi các DTD được viết bằng một ngôn ngữ hoàn toàn khác.
Ví dụ:
ĐTDĐ:
<?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>
DTD chỉ có thể có hai loại dữ liệu là CDATA và PCDATA. Nhưng trong một lược đồ, bạn có thể sử dụng tất cả các kiểu dữ liệu nguyên thủy mà bạn sử dụng trong ngôn ngữ lập trình và bạn có thể linh hoạt xác định các kiểu dữ liệu tùy chỉnh của riêng mình.
Nhà phát triển xây dựng một lược đồ có thể tạo các loại dữ liệu tùy chỉnh dựa trên các loại dữ liệu cốt lõi và bằng cách sử dụng các toán tử và sửa đổi khác nhau.
Khi XML lần đầu tiên xuất hiện, chúng tôi được thông báo rằng nó sẽ giải quyết tất cả các vấn đề của chúng tôi: XML sẽ thân thiện với người dùng, có thể mở rộng vô hạn, tránh gõ mạnh và không yêu cầu bất kỳ kỹ năng lập trình nào. Tôi đã tìm hiểu về DTD và đã viết trình phân tích cú pháp XML của riêng tôi. Hơn 15 năm sau, tôi thấy rằng hầu hết XML không thân thiện với người dùng và không có khả năng mở rộng (tùy thuộc vào cách sử dụng của nó). Ngay khi một số guốc thông minh nối XML vào cơ sở dữ liệu, tôi biết rằng các kiểu dữ liệu là tất cả nhưng không thể tránh khỏi. Và, bạn sẽ thấy XSLT (tệp chuyển đổi) mà tôi phải làm việc vào một ngày khác. Nếu đó không phải là lập trình, tôi không biết nó là gì! Ngày nay, không có gì lạ khi thấy tất cả các loại vấn đề liên quan đến dữ liệu hoặc giao diện XML trở nên tồi tệ. Tôi yêu XML nhưng, nó đã đi xa khỏi điểm xuất phát vị tha ban đầu của nó.
Câu trả lời ngắn gọn? Các DTD đã không được ủng hộ XSD vì XSD cho phép bạn xác định cấu trúc XML với độ chính xác cao hơn.
Mục đích của DTD là xác định cấu trúc của tài liệu XML. Nó xác định cấu trúc với một danh sách các yếu tố pháp lý:
<!ATTLIST contact type CDATA #IMPLIED>
<!ELEMENT address1 ( #PCDATA)>
<!ELEMENT city ( #PCDATA)>
<!ELEMENT state ( #PCDATA)>
<!ELEMENT zip ( #PCDATA)>
Lược đồ XML cho phép các tác giả lược đồ chỉ định dữ liệu của số lượng phần tử phải là số hoặc cụ thể hơn là số nguyên. Trong ví dụ sau tôi đã sử dụng 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>
DTD bị phản đối khá nhiều vì nó bị hạn chế về tính hữu dụng như ngôn ngữ lược đồ, không hỗ trợ không gian tên và không hỗ trợ kiểu dữ liệu. Ngoài ra, cú pháp của DTD khá phức tạp, gây khó khăn cho việc hiểu và duy trì ..
DTD chỉ ra cú pháp của phần tử XML
Các lược đồ XML là giải pháp thay thế của DTD để xác thực XML