Pas*_*ent 124
从将DTD转换为Schema文章的DTD和Schema部分之间的差异:
DTD和XML Schema之间的关键区别在于XML Schema使用基于XML的语法,而DTD具有从SGML DTD保留的独特语法.虽然DTD经常因为需要学习新语法而受到批评,但语法本身却相当简洁.对于XML Schema来说,情况恰恰相反,XML Schema虽然冗长,但也使用了标签和XML,因此XML的作者应该发现XML Schema的语法不那么令人生畏.
DTD的目标是为可能希望将SGML DTD转换为XML DTD的应用程序保留与SGML的兼容级别.但是,为了与XML的一个目标保持一致,"XML标记中的简洁性至关重要",并没有真正关心保持语法简洁.
[...]
那么当我们转换DTD时,哪些其他差异可能尤为重要?让我们来看看.
打字
DTD和XML Schema之间最重要的区别是能够在Schema中结合元素和属性声明创建和使用数据类型.实际上,XML Schema Recommendation的一半用于数据类型化和XML Schema,这是一个非常重要的区别.我们将在本书的第三部分"XML Schema数据类型"中详细介绍数据类型.
[...]
发生限制
DTD和Schema显着不同的另一个区域是出现约束.如果您回忆我们之前的第2章"模式结构"(或您自己的DTD工作)中的示例,可以使用三个符号来限制元素的出现次数:*,+和?.
[...]
枚举
所以,假设我们有一个元素,我们希望能够为衬衫定义尺寸属性,这允许用户选择尺寸:小,中或大.我们的DTD看起来像这样:
Run Code Online (Sandbox Code Playgroud)<!ELEMENT item (shirt)> <!ELEMENT shirt (#PCDATA)> <!ATTLIST shirt size_value (small | medium | large)>
[...]
但是,如果我们想
size
成为一个元素呢?我们不能用DTD做到这一点.DTD不提供元素文本内容中的枚举.但是,由于使用Schema的数据类型,当我们在前面的示例中声明枚举时,我们实际上创建了一个我们现在可以用于元素的simpleType
被调用size_values
:Run Code Online (Sandbox Code Playgroud)<xs:element name="size" type="size_value">
[...]
小智 87
XML模式定义(XSD)和文档类型定义(DTD)之间的差异包括:
更新时间:2015.08.26
并非所有这些要点都是100%准确,但你得到了要点.
另一方面:
N R*_*awa 20
正如许多人之前提到的,XML Schema使用基于XML的语法,DTD具有独特的语法.DTD不支持数据类型,这很重要.
让我们看一个非常简单的例子,其中大学有多个学生,每个学生有两个元素"名字"和"年".请注意,我在代码中使用"// - >"仅用于评论.
现在我将在DTD和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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
小智 9
both specify elements, attributes, nesting, ordering, #occurences
Run Code Online (Sandbox Code Playgroud)
XSD also has data types, (typed) pointers, namespaces, keys and more.... unlike DTD
Run Code Online (Sandbox Code Playgroud)
此外,虽然XSD很简单,但它的语法是XML的扩展,使得快速学习变得方便.
一个区别还在于,在DTD中,元素的内容模型完全由其名称决定,与文档中出现的位置无关.所以,说你想有一个name
你的子元素person
元素本身具有的子元素first
和last
.然后,如果你想在同一个文档中有一个name
元素的子元素city
,那么还需要有子元素first
和last
.相比之下,XML Schema允许您在本地声明子元素类型,因此在这种情况下,您可以name
为两者person
和city
单独声明子元素,在这些上下文中为它们提供适当的内容模型.
另一个主要区别是对名称空间的支持.由于DTD是原始XML规范的一部分(并且继承自SGML),因此它们根本不是名称空间感知,因为稍后会指定XML名称空间.您可以将DTD与名称空间结合使用,但它需要一些扭曲,例如被迫在DTD中定义前缀并仅使用这些前缀,而不是能够使用任意前缀.
对我来说,其他差异大多是肤浅的.可以轻松地将数据类型支持添加到DTD,语法只是语法.(我,其中一个,发现XML Schema语法很糟糕,并且永远不想手工维护XML Schema,我不会说DTD或RELAX NG模式;如果我出于某种原因需要XML Schema,我通常会写一个RELAX NG并将其转换为trang
.)
DTD的目的是定义 XML 文档的结构。它定义了具有合法元素列表的结构:
<!ATTLIST contact type CDATA #IMPLIED>
<!ELEMENT address1 ( #PCDATA)>
<!ELEMENT city ( #PCDATA)>
<!ELEMENT state ( #PCDATA)>
<!ELEMENT zip ( #PCDATA)>
Run Code Online (Sandbox Code Playgroud)
XML Schema使模式作者能够指定元素数量的数据必须是数字,或者更具体地说,是整数。在以下示例中,我使用了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>
Run Code Online (Sandbox Code Playgroud)
相似之处:
DTD和模式都执行相同的基本功能:
差异:
DTD对于文本密集型应用程序更好,而模式对于数据密集型工作流具有多个优点。
模式以XML编写,因此遵循相同的规则,而DTD以完全不同的语言编写。
例子:
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)>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
175018 次 |
最近记录: |