Apa perbedaan antara Skema XML dan DTD?

175

Saya telah menelusuri pertanyaan ini di Google, tetapi saya tidak mengerti dengan jelas apa itu skema XML dan DTD (definisi tipe dokumen), dan mengapa skema XML lebih kuat dibandingkan dengan DTD.

Bimbingan apa pun akan sangat dihargai.

Rachel
sumber

Jawaban:

135

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 sizemenjadi 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 sebuah simpleTypedisebut size_valuesyang kita sekarang dapat menggunakan dengan elemen:

<xs:element name="size" type="size_value">

[...]

Thivent Pascal
sumber
1
hanya sebuah catatan, W3C tampaknya berpikir bahwa DTD adalah jenis bahasa skema XML: "Ada beberapa bahasa skema yang berbeda dalam penggunaan luas, tetapi yang utama adalah Document Type Definition (DTD), Relax-NG, Schematron dan W3C XSD ( Definisi Skema XML). " W3.org/standards/xml/schema
Mordechai
1
@Mordechai Saya kira mereka menentukan DTD sebagai bahasa skema bukan skema XML.
kaartic
89

Perbedaan antara Definisi Skema XML (XSD) dan Document Type Definition (DTD) meliputi:

  • Skema XML ditulis dalam XML sementara DTD diturunkan dari sintaks SGML.
  • Skema XML mendefinisikan tipe data untuk elemen dan atribut sementara DTD tidak mendukung tipe data.
  • Skema XML memungkinkan dukungan untuk ruang nama sementara DTD tidak.
  • Skema XML menentukan jumlah dan urutan elemen anak, sedangkan DTD tidak.
  • Skema XML dapat dimanipulasi sendiri dengan XML DOM tetapi tidak mungkin dalam kasus DTD.
  • menggunakan skema XML pengguna tidak perlu belajar bahasa baru tetapi bekerja dengan DTD sulit bagi pengguna.
  • Skema XML menyediakan komunikasi data yang aman, misalnya pengirim dapat menggambarkan data sedemikian rupa sehingga penerima akan mengerti, tetapi dalam kasus data DTD dapat disalahpahami oleh penerima.
  • Skema XML dapat diperpanjang sementara DTD tidak dapat diperluas.

UPDATE : 2015.08.26

Tidak semua poin-poin ini 100% akurat, tetapi Anda mendapatkan intinya.

Di samping itu:

  • DTD memungkinkan Anda menentukan nilai ENTITY baru untuk digunakan dalam file XML Anda.
  • DTD memungkinkan Anda memperluasnya secara lokal ke file XML individual.
tanuja nanda
sumber
21

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.

masukkan deskripsi gambar di sini

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>
N Randhawa
sumber
16

DTD mendahului XML dan karenanya bukan XML yang valid itu sendiri. Itu mungkin alasan terbesar penemuan XSD.

troelskn
sumber
tepatnya - Skema XSD / XML adalah XML itu sendiri - yang merupakan hal yang sangat bagus!
marc_s
hmm, XSD menambahkan lebih dari sekedar sintaks XML; misalnya, tipe data
Rubens Farias
9

Kesamaan antara XSD dan DTD

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

Perbedaan antara XSD dan DTD

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.

krishna_kp
sumber
2
DTD lebih terbatas daripada XSD sejauh #occurences dengan hanya pilihan 1, 0 or 1, 0 or more, sementara XSD dapat menentukan minimum dan jumlah maksimum.
Jesse Chisholm
8

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

  • sebuah personelemen
  • dengan elemen anak bernama name
  • sebuah namesendiri memiliki elemen anak firstdan last.

Seperti ini

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

Jika suatu cityelemen dalam dokumen yang sama juga perlu memiliki 'nama' elemen anak, DTD mensyaratkan bahwa elemen 'nama' ini harus memiliki elemen anak firstdan lastjuga. Terlepas dari kenyataan itu city.nametidak memerlukan firstdan lastsebagai anak-anak.

Sebaliknya, Skema XML memungkinkan Anda untuk mendeklarasikan tipe elemen anak secara lokal; Anda dapat mendeklarasikan nameelemen anak untuk keduanya persondan citysecara 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.)

JaakkoK
sumber
6

Kesamaan :

DTD dan Skema keduanya melakukan fungsi dasar yang sama:

  • Pertama, mereka berdua mendeklarasikan daftar elemen dan atribut cucian.
  • Kedua, keduanya menjelaskan bagaimana elemen-elemen tersebut dikelompokkan, disarangkan, atau digunakan dalam XML. Dengan kata lain, mereka menyatakan aturan di mana Anda mengizinkan seseorang untuk membuat file XML dalam alur kerja Anda, dan
  • Ketiga, baik DTD maupun skema menyediakan metode untuk membatasi, atau memaksa, jenis atau format elemen. Misalnya, dalam DTD atau Skema Anda dapat memaksa bidang tanggal ditulis sebagai 01/05/06 atau 1/5/2006.

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>
ACV
sumber
4

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.

Nirav Daraniya
sumber
DTD juga dapat memiliki subset CDATA yang disebut nilai enumerasi .
Jesse Chisholm
4

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.

Robert
sumber
4

XML DTD

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

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>

Doro
sumber
2

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.

vtd-xml-author
sumber
2
Sudah usang? Tidak. [XDR sudah usang] Keluar dari mode? Mungkin. Lebih terbatas dari XSD? Iya. Subset fungsionalitas dari fungsionalitas XSD? Tidak. Sintaksnya terlalu rumit? Hampir tidak, hanya berbeda (IMHO). Secara pribadi saya menemukan DTD lebih mudah dibaca daripada XSD karena itu bukan XML.
Jesse Chisholm
-7

DTD menunjukkan sintaks elemen XML

XML Schemas adalah alternatif Microsoft untuk DTD untuk memvalidasi XML

purushothama
sumber