XML Şeması ve DTD arasındaki fark nedir?


175

Bu soruyu googled, ancak XML şeması ve DTD (belge türü tanımı) nedir ve XML şemasının DTD'ye kıyasla neden daha güçlü olduğunu açıkça anlamıyorum.

Herhangi bir rehberlik çok takdir edilecektir.

Yanıtlar:


136

Gönderen DTD ve şema Arasındaki Farklılıkların bölümüne bir şema içine dönüştürme bir DTD makale:

DTD'ler ve XML Şeması arasındaki kritik fark, XML Şeması'nın XML tabanlı bir sözdizimi kullanmasıdır; oysa DTD'lerin SGML DTD'lerden elde edilen benzersiz bir sözdizimi vardır. Her ne kadar DTD'ler yeni bir sözdizimi öğrenme ihtiyacı nedeniyle sık sık eleştirilse de, sözdiziminin kendisi oldukça kısadır. Bunun tersi ayrıntılı olan XML Şeması için geçerlidir, ancak XML yazarlarının XML Şeması sözdizimini daha az korkutucu bulmaları için etiketleri ve XML'i de kullanır.

DTD'lerin amacı, SGML DTD'leri XML DTD'lere dönüştürmek isteyebilecek uygulamalar için SGML ile uyumluluk düzeyini korumaktı. Bununla birlikte, XML'in amaçlarından birine uygun olarak, "XML biçimlendirmesindeki terslik çok az öneme sahiptir", sözdizimini kısa tutmakla ilgili gerçek bir endişe yoktur.

[...]

DTD'yi dönüştürürken özellikle önemli olabilecek diğer bazı farklar nelerdir? Hadi bir bakalım.

Yazıyor

DTD'ler ve XML Şeması arasındaki en önemli fark, şemada öğe ve nitelik bildirimleriyle birlikte veri türleri oluşturma ve kullanma yeteneğidir. Aslında, XML Şeması Tavsiyesinin yarısının veri türüne ve XML Şemasına ayrılması o kadar önemli bir farktır. Bu kitabın "XML Şeması Veri Türleri" başlıklı Kısmında veri türlerini ayrıntılı olarak ele alıyoruz.

[...]

Oluşum Kısıtlamaları

DTD'lerin ve Şema'nın önemli ölçüde farklı olduğu bir başka alan da oluşum kısıtlamalarıdır. Bölüm 2, "Şema Yapısı" (veya DTD'lerle kendi çalışmanız) konusundaki önceki örneklerden hatırlarsanız, bir öğenin oluşum sayısını sınırlamak için kullanabileceğiniz üç sembol vardır: *, + ve?.

[...]

numaralandırma

Diyelim ki bir elementimiz vardı ve gömlek için bir beden niteliği tanımlamak istedik, bu da kullanıcıların bir beden seçmelerine izin verdi: küçük, orta veya büyük. DTD'miz şöyle görünecektir:

<!ELEMENT item (shirt)>
<!ELEMENT shirt (#PCDATA)>
<!ATTLIST shirt
    size_value (small | medium | large)>

[...]

Ama ya sizebir element olmak isteseydik ? Bunu DTD ile yapamayız. DTD'ler bir öğenin metin içeriğinde numaralandırma sağlamaz. Bununla birlikte, Şema ile veri türleri nedeniyle, önceki örnekteki numaralandırmayı ilan ettiğimizde, aslında şimdi bir öğeyle kullanabileceğimiz bir simpleTypeçağrı oluşturduk size_values:

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

[...]


1
W3C, DTD'nin bir tür XML şema dili olduğunu düşünüyor gibi görünüyor: "Yaygın kullanımda birkaç farklı şema dili var, ancak başlıcaları Belge Türü Tanımları (DTD'ler), Relax-NG, Schematron ve W3C XSD ( XML Şema Tanımları). " W3.org/standards/xml/schema
Mordechai

1
@Mordechai Sanırım DTD'yi XML şeması değil şema dili olarak belirtiyorlar .
kaartic

90

XML Şeması Tanımı (XSD) ile Belge Türü Tanımı (DTD) arasındaki farklar şunlardır:

  • XML şemaları XML'de yazılırken DTD SGML sözdiziminden türetilir.
  • XML şemaları, DTD veri türlerini desteklemezken öğeler ve nitelikler için veri türlerini tanımlar.
  • XML şemaları DTD izin vermezken ad alanları için desteğe izin verir.
  • XML şemaları alt öğelerin sayısını ve sırasını tanımlarken DTD tanımlamaz.
  • XML şemaları XML DOM ile kendi başınıza manipüle edilebilir, ancak DTD durumunda mümkün değildir.
  • XML şeması kullananların yeni bir dil öğrenmesi gerekmez, ancak DTD ile çalışmak bir kullanıcı için zordur.
  • XML şeması güvenli veri iletişimi sağlar, yani gönderici verileri alıcının anlayacağı şekilde tanımlayabilir, ancak DTD verilerinin alıcı tarafından yanlış anlaşılması durumunda.
  • DTD genişletilemezken XML şemaları genişletilebilir.

GÜNCELLEME : 2015.08.26

Tüm bu mermi noktaları% 100 doğru değildir, ancak özü elde edersiniz.

Diğer yandan:

  • DTD , XML dosyanızda kullanmak için yeni ENTITY değerleri tanımlamanızı sağlar .
  • DTD, dosyayı tek bir XML dosyasına yerel olarak genişletmenizi sağlar.

21

Daha önce birçok kişinin belirttiği gibi, XML Şeması XML tabanlı bir sözdizimi kullanır ve DTD'lerin benzersiz bir sözdizimi vardır. DTD önemli olan veri tiplerini desteklemez.

Üniversitenin birden fazla öğrencisi olduğu ve her öğrencinin iki ismi "isim" ve "yılı" olduğu çok basit bir örneği görelim. Kodumda yalnızca yorumlar için "// ->" kullandığımı lütfen unutmayın.

resim açıklamasını buraya girin

Şimdi bu örneği hem DTD'de hem de XSD'de yazacağım.

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>

XML Şeması Tanımı (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, XML'den önce gelir ve bu nedenle geçerli XML'in kendisi değildir. Muhtemelen XSD'nin buluşunun en büyük nedeni.


tam olarak - XSD / XML Şeması XML'in kendisidir - bu gerçekten iyi bir şeydir!
marc_s

hmm, XSD sadece XML sözdiziminden daha fazlasını ekler; örneğin, veri türleri
Rubens Farias

9

XSD ve DTD arasındaki benzerlikler

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

XSD ve DTD arasındaki farklar

XSD also has data types, (typed) pointers, namespaces, keys and more.... unlike DTD 

Üstelik XSD biraz ayrıntılı olmasına rağmen, sözdizimi XML'in uzantısıdır ve hızlı öğrenmeyi kolaylaştırır.


2
DTD daha XSD kadarıyla daha sınırlıdır #occurences sadece seçenekleriyle 1, 0 or 1, 0 or more, XSD minimum ve maksimum sayısını belirtebilirsiniz iken.
Jesse Chisholm

8

Bir fark, bir DTD'de, bir öğenin içerik modelinin, belgede göründüğü yerden bağımsız olarak adıyla tamamen belirlenmesidir:

Sahip olmak istediğinizi varsayarsak

  • bir personeleman
  • adlı bir alt öğe ile name
  • Bir namekendisi alt öğelere sahiptir firstve last.

Bunun gibi

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

Bir ederse cityaynı belgede eleman aynı zamanda bir alt öğesinin 'adı' olması gerekir DTD bu 'name' eleman alt öğelere sahip gerektirir firstve lasthem de. Gerçi çocuk city.namegerektirmez firstve gerçektir last.

Bunun aksine, XML Şeması alt öğe türlerini yerel olarak bildirmenize olanak tanır; Eğer olduğuna dair karar nameher ikisi için de alt öğelerini personve cityayrı ayrı. Böylece onlara bu bağlamlarda uygun içerik modellerini vermek.

Diğer büyük fark isim alanları için destek. DTD'ler orijinal XML belirtiminin bir parçası olduğundan (ve SGML'den devralındığından), XML ad alanları daha sonra belirtildiği için ad alanı tanımazlar. DTD'leri ad alanlarıyla birlikte kullanabilirsiniz, ancak DTD'deki önekleri tanımlamak zorunda kalmak ve isteğe bağlı önekleri kullanmak yerine yalnızca bu önekleri kullanmak gibi bazı eğriler gerektirir.

Bana göre, diğer farklılıklar çoğunlukla yüzeyseldir. Veri tipi desteği DTD'lere kolayca eklenebilir ve sözdizimi sadece sözdizimidir. (Birincisi, XML Şeması sözdizimini korkunç buluyorum ve asla DTD'ler veya RELAX NG şemaları hakkında söyleyemediğim bir XML Şemasını el ile tutmak istemem; Bir nedenden dolayı bir XML Şemasına ihtiyacım varsa, genellikle yazarım bir RELAX NG olanı ile dönüştürün trang.)


6

Benzerlikler :

DTD'ler ve Şemalar aynı temel işlevleri yerine getirir:

  • İlk olarak, her ikisi de bir çamaşır listesi unsurları ve nitelikleri beyan eder.
  • İkincisi, her ikisi de bu öğelerin XML içinde nasıl gruplandığını, iç içe yerleştirildiğini veya kullanıldığını açıklar. Başka bir deyişle, birisinin iş akışınızda XML dosyası oluşturmasına izin verdiğiniz kuralları ve
  • Üçüncü olarak, hem DTD'ler hem de şemalar, bir öğenin türünü veya biçimini kısıtlamak veya zorlamak için yöntemler sağlar. Örneğin, DTD veya Şema içinde bir tarih alanının 01/05/06 veya 1/5/2006 olarak yazılmasını zorlayabilirsiniz.

farklılıklar:

  • DTD'ler metin yoğun uygulamalar için daha iyidir, şemaların veri yoğun iş akışları için çeşitli avantajları vardır.

  • Şemalar XML olarak yazılır ve böylece aynı kuralları uygularken DTD'ler tamamen farklı bir dilde yazılır.

Örnekler:

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>

4

DTD'de yalnızca iki tür veri olabilir, CDATA ve PCDATA. Ancak bir şemada, programlama dilinde kullandığınız tüm ilkel veri türünü kullanabilirsiniz ve kendi özel veri türlerinizi tanımlama esnekliğine sahip olursunuz.

Bir şema oluşturan geliştirici, temel veri türlerine dayalı olarak ve farklı işleçler ve değiştiriciler kullanarak özel veri türleri oluşturabilir.


DTD ayrıca numaralandırma değerleri adı verilen CDATA alt kümesine sahip olabilir .
Jesse Chisholm

4

XML ilk çıktığında, tüm sorunlarımızı çözeceği söylendi: XML kullanıcı dostu olacak, sınırsız genişletilebilir, güçlü yazımdan kaçınacak ve herhangi bir programlama becerisi gerektirmeyecek. DTD'leri öğrendim ve kendi XML ayrıştırıcımı yazdım. 15+ yıl sonra, çoğu XML'in kullanıcı dostu olmadığını ve (genişletilmesine bağlı olarak) çok genişletilebilir olmadığını görüyorum. Bazı akıllı takunya XML'i bir veritabanına bağlar bağlamaz veri türlerinin kaçınılmaz olduğunu biliyordum. Ve geçen gün çalışmak zorunda olduğum XSLT'yi (dönüşüm dosyası) görmelisiniz. Bu programlama değilse, ne olduğunu bilmiyorum! Günümüzde XML verileri veya arayüzlerle ilgili her türlü sorunun kötüye gitmesi olağandışı değildir. XML'i seviyorum ama orijinal özgecil başlangıç ​​noktasından çok uzaklaştı.

Kısa cevap mı? Bir XSD, XML yapısını daha hassas bir şekilde tanımlamanıza izin verdiği için DTD'ler XSD'lerin lehine kullanımdan kaldırılmıştır.


4

XML DTD

DTD'nin amacı, bir XML belgesinin yapısını tanımlamaktır. Yapıyı yasal unsurların bir listesiyle tanımlar:

<!ATTLIST contact type CDATA #IMPLIED>
<!ELEMENT address1 ( #PCDATA)>
<!ELEMENT city ( #PCDATA)>
<!ELEMENT state ( #PCDATA)>
<!ELEMENT zip ( #PCDATA)>

XML Şeması

XML Şeması , şema yazarlarının öğe miktarının verilerinin sayısal veya daha da spesifik olarak bir tam sayı olması gerektiğini belirtmesini sağlar. Aşağıdaki örnekte kullandım 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, şema dili olarak kullanışlılığı ile sınırlı olduğundan, ad alanını desteklemediğinden ve veri türünü desteklemediğinden hemen hemen kullanımdan kaldırılmıştır. Buna ek olarak, DTD'nin sözdizimi oldukça karmaşıktır, anlaşılmasını ve bakımını zorlaştırır.


2
Kullanımdan kaldırıldı? Hayır. [XDR kullanımdan kaldırıldı] Modası bitiyor mu? Olabilir. XSD'den daha mı sınırlı? Evet. XSD işlevselliğinin işlevsellik alt kümesi? Hayır. Sözdizimi çok mu karmaşık? Çok az, sadece farklı (IMHO). Şahsen DTD'nin okunması XML değil çünkü XSD'den daha kolay.
Jesse Chisholm

-7

DTD, XML öğesinin sözdizimini gösterir

XML Şemaları Microsoft'un XML'yi doğrulamak için DTD'ye alternatifidir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.