趣味XML Schema入门 (1)
(这是一种尝试,不喜欢的朋友请多包涵,)
XML schema 是什么?
一个XML schema,或者叫XML模式,是对一个(或一组)XML文件的结构的说明,它也可以对其内容进行一些约束性和语义上的说明。
熟悉数据库的人可以把XML schema看成是数据库中数据模式在XML技术中的对应物。
为什么要给XML文件加个schema?
给一个(或一组)XML文件关联一个schema有不少好处,甚至可以说是必须的。没有哪个程序或者人,可以以一种有意义的方式处理任意的XML文件。每个程序都要假定它所要处理的XML文件具有特定的结构和内容,当给它处理的文件不是这种结构或内容时,它就处理不了。例如,把一个svg文件给没有安装svg插件的浏览器,浏览器无法呈现这个svg所表示那幅图画。
反过来说,当我们想使用以XML文件形式接收输入的某个程序时,那我们就得按照这个程序所能接受的格式来准备XML文件。我们不想把这个程序的源代码拿来看,来分析它究竟要接受什么样的格式,我们希望这个程序提供一个简洁而严格的关于它所接受的输入格式的说明书。这个说明书可以写成电视机的使用说明书那样,告诉我们怎么用电视机。只有一点不好,万一我们看了说明书之后,还是出了点什么错把电视机搞坏了,没有人赔。假设我们是一家给别人准备数据的公司,如果我们看了客户提供的数据格式说明,还是出了错,那就要么会挨骂,要么失去一个客户,说不定还得付出赔偿。所以问题在于,我们需要的不仅仅是数据格式的说明,还希望能在我们把数据呈交给客户或者某个程序去处理之前就看看数据到底符合不符合这个格式。这说明,这个格式不能象电视机说明书那样只能给人读一读,它得能被计算机处理,被计算机拿去检验数据的格式是不是有错。
这样一种能被计算机处理的关于XML文件结构和内容的说明,就是一个XML schema。所以,它的用处就在于提供一个可以被计算机付诸检验的数据格式说明。而拿XML schema去检验XML文件的程序叫做schema处理程序。所以,需要记住,不是一个schema自己去验证XML文件,它只是规定XML文件的格式,然后被拿去验证XML文件。
你可能要说,又不是schema可以检验数据,那为什么不直接写个程序去验证数据,还搞个schema出来,这不是多此一举吗!得记住,我们是一家数据公司,我们有很多客户,每个客户的数据格式都不一样。我们呢,只有5个人,而且只有一个mm会写程序,如果要她为每个客户的数据格式都写验证程序,那她不睡觉也写不完,而我们没钱再多请几个程序员,因为程序员对薪水的要求一般都很高。而其他四个人呢,常常没事做,帮不上,正好偷懒。老板很精明,他让这个mm程序员写一个通用的数据验证器,这个验证器针对不同客户的数据格式要求去检验他们各自的数据。mm说可以,但是得把每个客户的数据格式告诉这个程序。程序终于写出来了。这个时候其他四个人就帮得上忙了,就不能偷懒了。他们不用写程序,他们只要写数据格式说明就行了。
好了,我们不只五个人,我们有几个mm程序员,她们愿意加班加点的写程序,就是不想写个通用的验证器。她们很聪明,知道那样的话等于是自掘坟墓。问题是这个世界上又牛又傻的程序员做出来了那样的通用程序。我们不用不行,不用我们的公司就会倒闭,因为我们验证数据的成本比别人高得多。我们得用才能保住饭碗。倒也好,mm们现在不用加班加点了,轻轻松松写schema。
XML schema是怎样规定数据格式的
一个XML schema把XML 中的数据项列出来,指明哪个在外面,哪个在里面;哪个在前面,哪个在后面;哪些是一定得有的,哪些是可以没有的;哪个有的时候,另外某一个就一定得有,或者一定没有;哪个得是正数,哪个不能大于1000,等等,等等,这样的事。
我决定用schema了,怎么写啊?--- DTD与W3C XML Schema
那些傻牛人已经发明了几种用来说明XML文件格式的办法,其中听得比较多的是DTD和(W3C)XML Schema。W3C是World Wide Web Consortium 的缩写,因为有3个W开头,就成了W3。这和“披头四”有点象,Beatles乐队的音译,而他们是四个人,也译作“披头士”。
DTD是Document Type Definition的缩写,即文档类型定义。它出现在(W3C)XML Schema之前。之所以有这么个奇怪的名字,是因为它本来就不是用来说明XML数据文件格式的,它是用来说明XML文档格式的。搞什么怪啊,XML数据文件不就是XML文档吗?不骗你,真的很有些不一样!
如果我们写一篇文章,敲到计算机里面去,存下来,得到一个文档,如果这个文档是XML格式的,那就是XML文档。你要说,别唬人了,有谁用XML做文档啊,地球人都用word。非也!有很多人用XML做文档,XML的前身就是专门用来做文档的,而DTD实际上是给那个前身用的,后来也给XML用。那个前身我们就不多说了,省得跑题。另外一个例子,我们有很多人做网页,网页是什么?文档,而且可以说是XML文档,因为HTML是XML的那个前身的一个文档类型(或者说格式)而已。而XTHML就更是XML文档了,真真正正的XML文档。
有DTD就好了,干么要弄几个办法来写格式说明,这不是添乱嘛!当然不是。刚刚说了DTD不是用来说明数据格式的。如果把DTD拿来做数据格式说明并非完全不行,但是它有两个不足的地方。它只能说明“哪个在外面,哪个在里面;哪个在前面,哪个在后面;哪些是一定得有的,哪些是可以没有的;哪个有的时候,另外某一个就一定得有,或者一定没有;”这样结构方面的事情,不能说明“这个不能是负数,那个不能大于100,这个的名字得是英文的,那个的名字得是中文的”这些事情。用计算机术语来说,DTD没有提供数据类型,或者说它只提供了一种数据类型,文本。所以它很自觉地把自己叫做文档类型定义,而不敢自称为数据模式定义。另外一个问题是数据类型问题的引申。我们现在都用面向对象的东西了,我们希望数据格式也是面向对象的。而DTD有点老派,它被发明的时候,面向对象还在实验室里。
XML把自己定位在通用数据交换技术这样一个地位,却没办法准确定义数据格式,这很尴尬。所以W3C急忙忙要推出XML Schema。XML从一出世就被大家追捧,而它那时其实还不象大家说的那么好(可能现在也不是,但是它的确是个好东东,可以更好)。不能让大家失望啊,赶紧弥补先天不足。就有了XML Schema(和其他等等XML技术)。XML Schema 解决了上面说的那两个问题。对第一个问题,它解决得很漂亮。而对第二个问题,还有争议。争议归争议,大家已经迫不及待地用开了。