时隔两日,再次来整理XML的内容,似乎间隔有些长。终究还是不够勤快,压抑不住自己爱玩的心。今天在知乎上看到大师兄又写了一篇答案。倒不是对所提的问题有何想法,只是大师兄的某些话说到了心坎里:
“你只要不想等,不愿信,你站起来,关灯,收拾干净,拍屁股走人,出来你就是铁人,没有人伤得了你,但这应该不是你想要的。
这世上容易的,就是看破红尘,难的,恰是命里打滚,轻而易举,说一些不痛不痒,都是没想明白。”
是吧,感情也罢,梦想也罢,默默地等待,默默地付出,只觉得该为某些事情热血地追求。若自己某日,打着看破的幌子,放弃坚持的初衷。那我,还是想要为尘世的纷扰而不得解吧。等吧,等到想要的结果,等到该来的人。
“在散场的最后一秒到来之前,空荡荡的剧场里走进来一个人。
你就一定要说:
等你很久啦。”
扯远了,只是想来接着整理我的XML的。今天打算整理DTD, XML schema,这几项属于Schema的内容。
何谓schema
schema实际上一种描述语言,一般用于描述DBs或者XML,在此特指对XML的描述。通过Schema,可以描述XML的
- 标签(tag)和属性(attribute)的名字
 - 文件的结构:(元素(element)如何嵌套、哪个元素拥有哪个属性)
 - 数据:类型(字符串?数字?)
 
为何需要schema
- XML文档可以有更多可依赖的格式:结构,标签,数据类型。但同时想保持扩展性与灵活性。
 - 可以描述怎样的数据是合法的、期待的、事先设定。
 
对于使用schema有两种使用方式:
- 描述型(descriptive):为他人描述XML文档,如此,便可知道如何更好地组织数据。
 - 规范型(prescriptive):防止程序调用了错误的XML文档。
 
什么是DTD
DTD是在XML1.0时代的标准。DTD并不是一个典型的XML类型的文档,故而具有以下特点:
- 不能被解析为一个DOM (Document Object Model)
 - 无法扩展(即不能在一个DTD文档中import另一个DTD文档)
 - 易读易写。
 
DTD如何描述XML
描述一个逻辑结构的例子:
- elements
 
1  | <!ELEMENT name(#PCDATA)>  | 
- attributes
 
1  | <!ATTLIST name type(family|personal|place) "personal">  | 
此例子意为:元素name可以使用type属性,type可选值为family,personal,place,其中personal为默认值。
据此规范,正确的xml文档:
1  | <name>Bijan</name>  | 
不正确的:
1  | <name type="DontKnow">Bijan</name>  | 
由此,我们可以总结,DTD描述的模板如下:
1  | <!ELEMENT element-name (element-content)>  | 
其中element-content支持使用元素名的正则表达式。
另外DTD还能描述实体引用(类似宏定义)。例子如下:
1  | <!ENTITY writer "Donald Duck">  | 
如何使用DTD
DTD在XML文档中有两种引入方式,一种为内嵌型(internal),另一种外置型(external)。
内嵌型的使用方式:
1  | <?xml version="1.0" encoding="UTF-8"?>  | 
外置型使用方式:
1  | <?xml version="1.0" encoding="UTF-8"?>  | 
当然也可以两者同时使用:
1  | <?xml version="1.0" encoding="UTF-8"?>  | 
valid(不知如何翻译)
如果XML文件完全满足某一DTD文档,则认为该XML文档 valid w.r.t a DTD。
如果XML同时满足以下条件,则认为XML文档valid:
- 该文档是well-formed
 - 该文档引入了一个DTD文档
 - 该文档valid w.r.t 引入的文档
 - 声明元素为该文档的根元素:
<!DOCTYPE cartoon SYSTEM "cartoon.dtd">其中的cartoon。 
什么是XML Schema
XML Schema(也被称为XML Schema Definition、XSD)是DTD的替代品,并且一致认为其比DTD更加成功。相对DTD,XSD有这些特点:
- DTD不是well-formed XML文档,而XSD是
 - XSD有更强的表达能力
 - XSD支持namespaces, datatypes(date, 06/11/2014)
 - XML能描述元素的复杂content。
 
XSD例子:
DTD
1  | <?xml version="1.0" encoding="UTF-8"?>  | 
相应XSD
1  | <?xml version="1.0"?>  | 
###type, content, restriction and extension
XSD中的type可分为simpleType and complexType:
- simpleType可以用于属性,不带子元素或者不带属性的元素
 - complexType可以用于element content 或者mixed element content 或者 text content和attribuctes
 
而content的使用:
- 对于有属性声明的元素,我们不能使用simpleType,但是我们可以使用simpleContent来通过继承方式获得simpleType:
 
1  | <xs:element name = "size">  | 
- complexContent则包含了继承或扩展自complexType的content或element。
 
而restriction and extension则用于继承或者扩展type。从字面意义便可理解两者的区别。
更详细的内容可以参看w3schools.com。
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏
扫描二维码,分享此文章