Sự khác biệt giữa Lược đồ XML và DTD là gì?


175

Tôi đã googled câu hỏi này, nhưng tôi không hiểu rõ lược đồ XML và DTD (định nghĩa loại tài liệu) là gì và tại sao lược đồ XML mạnh hơn so với DTD.

Bất kỳ hướng dẫn sẽ được đánh giá cao.

Câu trả lời:


135

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 sizetrở 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ộc simpleTypegọi size_valuesmà 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">

[...]


1
chỉ là một lưu ý, W3C dường như nghĩ rằng DTD là một loại ngôn ngữ lược đồ XML: "Có một số ngôn ngữ lược đồ khác nhau được sử dụng rộng rãi, nhưng các ngôn ngữ chính là Định nghĩa loại tài liệu (DTD), Thư giãn-NG, Schematron và W3C XSD ( Định nghĩa lược đồ XML). " W3.org/stiterias/xml/schema
Mordechai

1
@Mordechai Tôi đoán họ đang chỉ định DTD là ngôn ngữ lược đồ chứ không phải lược đồ XML.
kaartic

89

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ác lược đồ XML được viết bằng XML trong khi DTD được lấy từ cú pháp SGML.
  • Các lược đồ XML xác định kiểu dữ liệu cho các thành phần và thuộc tính trong khi DTD không hỗ trợ kiểu dữ liệu.
  • Các lược đồ XML cho phép hỗ trợ các không gian tên trong khi DTD thì không.
  • Các lược đồ XML xác định số lượng và thứ tự của các phần tử con, trong khi DTD thì không.
  • Các lược đồ XML có thể được tự xử lý bằng XML DOM nhưng không thể thực hiện được trong trường hợp DTD.
  • sử dụng lược đồ XML người dùng không cần phải học một ngôn ngữ mới nhưng làm việc với DTD rất khó đối với người dùng.
  • Lược đồ XML cung cấp giao tiếp dữ liệu an toàn, tức là người gửi có thể mô tả dữ liệu theo cách mà người nhận sẽ hiểu, nhưng trong trường hợp dữ liệu DTD có thể bị người nhận hiểu nhầm.
  • Các lược đồ XML có thể mở rộng trong khi DTD không thể mở rộng.

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:

  • DTD cho phép bạn xác định các giá trị ENTITY mới để sử dụng trong tệp XML của mình.
  • DTD cho phép bạn mở rộng nó cục bộ thành một tệp XML riêng lẻ.

21

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.

nhập mô tả hình ảnh ở đây

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>

16

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.


chính xác - Lược đồ XSD / XML là chính XML - đó là một điều thực sự tốt!
marc_s

hmm, XSD thêm nhiều thứ hơn là cú pháp XML; ví dụ: kiểu dữ liệu
Rubens Farias

9

Sự tương đồng giữa XSD và DTD

both specify elements, attributes, nesting, ordering, #occurences

Sự khác biệt giữa XSD và DTD

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.


2
DTD được nhiều hạn chế hơn so với XSD như xa như #occurences chỉ với sự lựa chọn của 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.
Jesse Chisholm

8

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ó

  • một personyếu tố
  • với một phần tử con được gọi là name
  • một namechính nó có các yếu tố con firstlast.

Như thế này

   <person>
       <name>
            <first></first>
            <last></last>
       </name>
   </person>

Nếu một cityphầ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 firstlastlà tốt. Mặc dù thực tế là city.namekhông yêu cầu firstlastnhư 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 namephần tử con cho cả hai personcityriê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.)


6

Đ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:

  • Đầu tiên, cả hai đều khai báo một danh sách các yếu tố và thuộc tính giặt ủi.
  • Thứ hai, cả hai đều mô tả cách các phần tử đó được nhóm, lồng hoặc sử dụng trong XML. Nói cách khác, họ khai báo các quy tắc mà bạn cho phép ai đó tạo tệp XML trong quy trình công việc của bạn và
  • Thứ ba, cả DTD và lược đồ đều cung cấp các phương thức để hạn chế hoặc buộc, loại hoặc định dạng của một phần tử. Ví dụ: trong DTD hoặc Schema, bạn có thể buộc một trường ngày được viết là 01/05/06 hoặc 1/5/2006.

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>

4

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.


DTD cũng có thể có tập hợp con của CDATA được gọi là giá trị liệt kê .
Jesse Chisholm

4

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.


4

XML DTD

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

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>


2

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ì ..


2
Không dùng nữa? Không. [XDR không được dùng nữa] Đi ra khỏi thời trang? Có lẽ. Hạn chế hơn XSD? Đúng. Chức năng tập hợp con của chức năng XSD? Không. Cú pháp quá phức tạp? Hầu như, chỉ khác nhau (IMHO). Cá nhân tôi thấy DTD dễ đọc hơn XSD chính xác vì nó không phải là XML.
Jesse Chisholm

-7

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.