XML和DTD
最近在公司的工作用到一点点XML,虽然所用不多,但是也值得记述下来。
一、XML的读写
对XML文件的读和写,我所知道的是,标准的读写方式有两种,DOM和SAX。其中,SAX需要把整个XML文件先读进来,然后才允许你对这个文件进行读写,它的优点是操作方便,真的很方便;缺点就是效率上不好,因为它要先把整个文件读近来么。DOM则是把XML文件的元素看作流来处理,一个一个读进来,它的优点就是效率很好,因为DOM方式是读一点就可以处理一点,这个效率方面,应该和普通的文件处理没太大的区别;缺点就是操作不方便,这个不方便的程度,应该和普通的文件处理比能好那么一点点而已。性能和操作,不可兼得——多希望有兼得的那么一天啊! 所以对小的XML文件,尽管用SAX好了;要是这XML文件大小超过了1M,最好用DOM;如果超过了10M你还用SAX,那您可是有点想故意捣乱了。
二、XML的格式
说起来XML的格式真的挺简单,不是说了么XML的目标是让任何一个计算机硕士毕业的人可以在四个星期内完成一个XML解析器(不知道DOM接口SAX效率的解析器算不算),说实话,我觉得本科的就可以了。如果会用正则表达式,可能两个星期就足够了(包括一个星期休假时间)。
但是也有不简单的地方。
一个可以被解析器读入的XML文件,仅仅是合格的XML文件(Well-formated),要做到这一点很容易,你只要通过任何一个正确的XML解析器(包括计算机硕士用四个星期写的)采取SAX方式生成一个XML文件,那一定是合格的XML文件——想错你都没机会。
但是合格的XML文件未必就是合用的。
比如我今天在公司设计我们模块的XML文件格式,下星期有朋自远方来。原来我觉得这太简单了,很快就可以做完。确实我很快就做完了,但是马上发现问题了,因为在另外一个模块,德方提出了要求实现的格式,和我的完全不一样。比如表示设计模式这本书的信息,我是这样写的:
而如果按照德方提出的要求,就应该这样写:
也就是说,我把所有的数据都写到了属性里,而德方却要求把大部分的数据放在子节点里。那么谁的做法是对的呢?显然我们都是合格的。
这就涉及到一个XML标签的定义和使用的问题了。就我举的例子而言,比较好的做法是创建一个book的节点,然后把名字、作者、价格都作为属性而写上去。我们的都不好。但是在我们公司里的那种情况下,确实是德国人的做法好。我的做法写出来的文件,仅仅在IE里浏览的时候很漂亮,一目了然。德国人给的方案在IE里看起来,好丑,不过符合XML文件描述的数据的逻辑结构。
如果你学过数据库,那是不是觉得,就定义和使用XML标签这个问题上看,XML很类似与数据库的设计呢?要解决这个问题,就需要今天的最后一个主角:DTD出场了。
三、DTD的简单介绍
XML大家恐怕都是耳熟能详了,DTD就有点鲜为人知了。至少我一听到这东西的时候,总是把它和TDD弄混。所以在这里,我也就是能给DTD来点简单的介绍而已了。
DTD是Document Type Definition的缩写(我最讨厌缩写,特别是最近看一本CMMI的书,老天爷,全是缩写!)。它的作用是确保XML文件的正确性,具体而言,就是确保XML文件中的标签、元素是否是按照正确的方式使用的。比如上文中,一个人把所有的属性独立成一个个元素,然后再在元素里面加属性,另一个却把所有的属性都做成了元素,谁的谁错?谁都对了,但是这样对下去,我表示书的XML文件,就不能让德国人用,德国人表示书的XML文件我也不能用,XML就失去意义了。那就需要大家约定一个DTD文件了,我们双方都遵守这个DTD文件的约定,就不会出现这种问题了。而且,一个XML数据解析器在读一个XML文件的时候,可以先检查一下,这个XML文件是否符合约定的DTD标准,以此来判断这个XML文件是不是自己需要的数据。
DTD和XML结合在一起,有很多著名的应用,比如MathML,就是利用XML和DTD结合,制定出来用来描述数学表达式的一个标准。如果没有DTD,那么这样的标准是不可能推出的,当年牛顿和莱布尼茨两个人就搞出来两套微积分符号,现在这么多数学家,一定会这边要求如此写XML,那边要求如彼写XML,非乱套不可。
但是DTD的应用,恐怕不会太多了,这是因为DTD是有一些明显缺陷的。首先,它不符合XML语法,它是自成体系的另一套语法,相当的烦琐;其次,它是ASCII格式的,这不构成致命缺陷,但是XML文件完全是Unicode的情况下,它还保持古老的ASCII格式,就相当不协调了。还有其他缺陷,本池水浅学疏,还不知道,那就列到这里,给DTD个面子。
水深的人很多,所以他们提出了很多避免或者取代DTD的方法,比如XSLT,好象在CSDN的论坛,用的就是XML+XSLT吧?我保存了很多CSDN论坛的贴子,都不能看,非要我再保存一另外一个文件才能看。最著名的DTD取代者,当然是XML Schema了!XML Schema不仅仅没有DTD的缺陷,还有很多强大的优点——这个,本池又一次水浅学疏~
[原文在百度空间已经关闭]
标签集合/Tag clouds
C++
Symbain
轻松汇编
算法
论文学习
资治通鉴
Delphi
编程之美
Poco
MFC
Linux
IFC
知乎
汇编
数据分析
交叉编译
poco
j2me
android
XML
Java
DTD
飞信
零宽断言
诺基亚
联系人
编程
真值表
池西木
正则表达式
多线程
命令行
优化
stream
configure
cmake
VIM
UiAutomator
TDD
Symbian
Sqlite
SourceInsight
Python
MPAndroidChart
Kotlin
Flutter
Dokka
Chatgpt