Yanıtlar:
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
size
bir 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 birsimpleType
çağrı oluşturduksize_values
:<xs:element name="size" type="size_value">
[...]
XML Şeması Tanımı (XSD) ile Belge Türü Tanımı (DTD) arasındaki farklar şunlardır:
GÜNCELLEME : 2015.08.26
Tüm bu mermi noktaları% 100 doğru değildir, ancak özü elde edersiniz.
Diğer yandan:
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.
Ş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>
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.
both specify elements, attributes, nesting, ordering, #occurences
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.
1
, 0 or 1
, 0 or more
, XSD minimum ve maksimum sayısını belirtebilirsiniz iken.
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
person
elemanname
name
kendisi alt öğelere sahiptir first
ve last
.Bunun gibi
<person>
<name>
<first></first>
<last></last>
</name>
</person>
Bir ederse city
aynı belgede eleman aynı zamanda bir alt öğesinin 'adı' olması gerekir DTD bu 'name' eleman alt öğelere sahip gerektirir first
ve last
hem de. Gerçi çocuk city.name
gerektirmez first
ve gerçektir last
.
Bunun aksine, XML Şeması alt öğe türlerini yerel olarak bildirmenize olanak tanır; Eğer olduğuna dair karar name
her ikisi için de alt öğelerini person
ve city
ayrı 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
.)
Benzerlikler :
DTD'ler ve Şemalar aynı temel işlevleri yerine getirir:
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>
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.
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.
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ı , ş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>
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.
DTD, XML öğesinin sözdizimini gösterir
XML Şemaları Microsoft'un XML'yi doğrulamak için DTD'ye alternatifidir