Jawaban:
Dari bagian Perbedaan Antara DTD dan Skema dari Konversi DTD menjadi artikel Skema :
Perbedaan kritis antara DTD dan Skema XML adalah bahwa Skema XML menggunakan sintaksis berbasis XML, sedangkan DTD memiliki sintaks unik yang dimiliki dari SGML DTD. Meskipun DTD sering dikritik karena ini perlu mempelajari sintaks baru, sintaksis itu sendiri cukup singkat. Kebalikannya berlaku untuk Skema XML, yang verbose, tetapi juga menggunakan tag dan XML sehingga penulis XML harus menemukan sintaks Skema XML kurang menakutkan.
Tujuan DTD adalah untuk mempertahankan tingkat kompatibilitas dengan SGML untuk aplikasi yang mungkin ingin mengubah SGML DTD menjadi XML DTD. Namun, sesuai dengan salah satu tujuan XML, "kesederhanaan dalam markup XML adalah minimal penting," tidak ada masalah nyata dengan menjaga sintaks singkat.
[...]
Jadi apa sajakah perbedaan lain yang mungkin sangat penting ketika kita mengubah DTD? Mari lihat.
Mengetik
Perbedaan paling signifikan antara DTD dan Skema XML adalah kemampuan untuk membuat dan menggunakan tipe data dalam Skema dalam hubungannya dengan deklarasi elemen dan atribut. Faktanya, ini adalah perbedaan yang sangat penting sehingga setengah dari Rekomendasi Skema XML dikhususkan untuk datatyping dan Skema XML. Kami membahas tipe data secara rinci di Bagian III buku ini, "XML Schema Datatypes."
[...]
Kendala Kejadian
Area lain di mana DTD dan Skema berbeda secara signifikan adalah dengan kendala kejadian. Jika Anda ingat dari contoh sebelumnya di Bab 2, "Struktur Skema" (atau karya Anda sendiri dengan DTD), ada tiga simbol yang dapat Anda gunakan untuk membatasi jumlah kemunculan elemen: *, + dan?.
[...]
Pencacahan
Jadi, katakanlah kita memiliki elemen, dan kami ingin dapat mendefinisikan atribut ukuran untuk kemeja, yang memungkinkan pengguna untuk memilih ukuran: kecil, sedang, atau besar. DTD kami akan terlihat seperti ini:
<!ELEMENT item (shirt)> <!ELEMENT shirt (#PCDATA)> <!ATTLIST shirt size_value (small | medium | large)>
[...]
Tetapi bagaimana jika kita ingin
size
menjadi elemen? Kami tidak bisa melakukannya dengan DTD. DTD tidak menyediakan enumerasi dalam konten teks elemen. Namun, karena tipe data dengan skema, ketika kita menyatakan pencacahan dalam contoh sebelumnya, kita benar-benar menciptakan sebuahsimpleType
disebutsize_values
yang kita sekarang dapat menggunakan dengan elemen:<xs:element name="size" type="size_value">
[...]
Perbedaan antara Definisi Skema XML (XSD) dan Document Type Definition (DTD) meliputi:
UPDATE : 2015.08.26
Tidak semua poin-poin ini 100% akurat, tetapi Anda mendapatkan intinya.
Di samping itu:
Seperti banyak orang telah sebutkan sebelumnya, Skema XML menggunakan sintaksis berbasis XML dan DTD memiliki sintaks unik. DTD tidak mendukung tipe data, yang penting.
Mari kita lihat contoh yang sangat sederhana di mana universitas memiliki banyak siswa dan setiap siswa memiliki dua elemen "nama" dan "tahun". Harap perhatikan bahwa saya telah menggunakan "// ->" dalam kode saya hanya untuk komentar.
Sekarang saya akan menulis contoh ini dalam DTD dan 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>
Definisi Skema 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 mendahului XML dan karenanya bukan XML yang valid itu sendiri. Itu mungkin alasan terbesar penemuan XSD.
both specify elements, attributes, nesting, ordering, #occurences
XSD also has data types, (typed) pointers, namespaces, keys and more.... unlike DTD
Selain itu meskipun XSD sedikit verbose sintaksnya adalah ekstensi dari XML, membuatnya mudah untuk belajar dengan cepat.
1
, 0 or 1
, 0 or more
, sementara XSD dapat menentukan minimum dan jumlah maksimum.
Satu perbedaan adalah bahwa dalam DTD model konten suatu elemen sepenuhnya ditentukan oleh namanya, terlepas dari di mana ia muncul dalam dokumen:
Dengan asumsi Anda ingin memilikinya
person
elemenname
name
sendiri memiliki elemen anak first
dan last
.Seperti ini
<person>
<name>
<first></first>
<last></last>
</name>
</person>
Jika suatu city
elemen dalam dokumen yang sama juga perlu memiliki 'nama' elemen anak, DTD mensyaratkan bahwa elemen 'nama' ini harus memiliki elemen anak first
dan last
juga. Terlepas dari kenyataan itu city.name
tidak memerlukan first
dan last
sebagai anak-anak.
Sebaliknya, Skema XML memungkinkan Anda untuk mendeklarasikan tipe elemen anak secara lokal; Anda dapat mendeklarasikan name
elemen anak untuk keduanya person
dan city
secara terpisah. Dengan demikian memberi mereka model konten yang tepat dalam konteks tersebut.
Perbedaan utama lainnya adalah dukungan untuk ruang nama. Karena DTD adalah bagian dari spesifikasi XML asli (dan diwarisi dari SGML), mereka sama sekali tidak sadar namespace karena ruang nama XML ditentukan kemudian. Anda dapat menggunakan DTD dalam kombinasi dengan namespaces, tetapi itu memerlukan beberapa contortions, seperti dipaksa untuk mendefinisikan awalan di DTD dan hanya menggunakan awalan itu, alih-alih bisa menggunakan awalan sewenang-wenang.
Bagi saya, perbedaan lain kebanyakan dangkal. Dukungan tipe data dapat dengan mudah ditambahkan ke DTD, dan sintaksnya hanya sintaks. (Saya, untuk satu, menemukan sintaks XML Schema mengerikan dan tidak akan pernah ingin tangan-mempertahankan XML Schema, yang saya tidak akan mengatakan tentang skema DTD atau RELAX NG; jika saya memerlukan skema XML untuk beberapa alasan, saya biasanya menulis RELAX NG satu dan mengonversinya dengan trang
.)
Kesamaan :
DTD dan Skema keduanya melakukan fungsi dasar yang sama:
Perbedaan:
DTD lebih baik untuk aplikasi intensif teks, sementara skema memiliki beberapa keuntungan untuk alur kerja intensif data.
Skema ditulis dalam XML dan karenanya mengikuti aturan yang sama, sedangkan DTD ditulis dalam bahasa yang sama sekali berbeda.
Contoh:
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>
DTD hanya dapat memiliki dua jenis data, CDATA dan PCDATA. Tetapi dalam skema Anda bisa menggunakan semua tipe data primitif yang Anda gunakan dalam bahasa pemrograman dan Anda memiliki fleksibilitas dalam menentukan tipe data kustom Anda sendiri.
Pengembang yang membangun skema dapat membuat tipe data khusus berdasarkan pada tipe data inti dan dengan menggunakan berbagai operator dan pengubah.
Ketika XML pertama kali keluar, kami diberitahu itu akan menyelesaikan semua masalah kami: XML akan menjadi user-friendly, tak terhingga panjang, menghindari pengetikan yang kuat, dan tidak memerlukan keterampilan pemrograman apa pun. Saya belajar tentang DTD dan menulis parser XML saya sendiri. 15+ tahun kemudian, saya melihat bahwa sebagian besar XML tidak ramah-pengguna, dan tidak terlalu dapat dikembangkan (tergantung penggunaannya). Segera setelah beberapa bakiak yang pandai menghubungkan XML ke sebuah database, saya tahu bahwa tipe-tipe data tidak bisa dihindari. Dan, Anda harus melihat XSLT (file transformasi) saya harus bekerja pada hari yang lain. Jika itu bukan pemrograman, saya tidak tahu apa itu! Saat ini tidak biasa melihat semua jenis masalah yang berkaitan dengan data XML atau antarmuka menjadi buruk. Saya suka XML tetapi, itu telah menyimpang jauh dari titik awal altruistik aslinya.
Jawaban singkatnya? DTD sudah tidak digunakan lagi karena XSD karena XSD memungkinkan Anda menentukan struktur XML dengan lebih presisi.
Tujuan DTD adalah untuk menentukan struktur dokumen XML. Ini mendefinisikan struktur dengan daftar elemen hukum:
<!ATTLIST contact type CDATA #IMPLIED>
<!ELEMENT address1 ( #PCDATA)>
<!ELEMENT city ( #PCDATA)>
<!ELEMENT state ( #PCDATA)>
<!ELEMENT zip ( #PCDATA)>
Skema XML memungkinkan pembuat skema untuk menentukan bahwa data jumlah elemen harus berupa angka atau, bahkan lebih khusus lagi, bilangan bulat. Dalam contoh berikut ini saya menggunakan 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 cukup banyak ditinggalkan karena terbatas dalam kegunaannya sebagai bahasa skema, tidak mendukung namespace, dan tidak mendukung tipe data. Selain itu, sintaksis DTD cukup rumit, membuatnya sulit untuk dipahami dan dipelihara.
DTD menunjukkan sintaks elemen XML
XML Schemas adalah alternatif Microsoft untuk DTD untuk memvalidasi XML