(这里的XML不仅仅指XML脚本语言,还包括XML的一系列技术,包括DTD,XSLT,XML SCHEMA,XPATH,DOM,SAX等等)
XML的本质是什么?这个问题对于很多XML的初学者来说都不容易回答。因为XML涉及的方面太多,有人是为了写出更漂亮的网页才从HTML进一步学到XML;有人是为了学JAVA才来了解XML;有人是从数据库到XML;有人是从UML到XML;当然还有一些人是从SOAP或者其他网络协议而了解到XML。那么到底如何解释XML的本质呢?
我认为XML的本质是数据,XML文档实际上是对数据的格式化存储,而XML的一系列技术都是围绕着数据来发展的。例如DTD、Schema是对数据格式的定义和检验;XSLT是对数据的转换;DOM、SAX是对数据的提取和操作。
既然XML只是数据,而且是用文本形式存储的数据,那么为什么不更简单的用普通文本来存储数据呢?早期的一些程序员确实是这么做的,但是这么做的缺点是对于每一组数据,都需要专用的数据格式定义、检验、转换和操作的程序。如果使用XML来存储数据,由于XML的一系列技术已经对以上的问题提供了工具,我们只需要使用那些技术即可快捷的达到自己的目的。有人可能会说,使用数据库不是更方便么?它也提供了以上的功能。确实如此,但是并不是每个地方都适用数据库的,如果说数据库是大而全的数据解决方案的话,XML可以用“举重若轻,大象无形”来形容,这一点后面再讨论。
XML的本质决定了它在网页制作方面比HTML更具有优越性。传统的网页包括HTML+CSS,在这种模式中,数据和数据的显示特性都包含在HTML中,CSS只是对显示特性的一种补充;而XML网页包括XML+XML Schema+XSL,其中XML存储数据,XML Schema定义了数据的存储格式,XSL定义了数据的显示特性(其实它定义了如何将XML转换为HTML,实际上就是定义了数据的显示特性)。使用XML制作的网页将数据、数据格式和显示特性清晰的分为三个部分,在添加或者修改网页的时候可以单独的修改每个部分,从而得到更好的维护性和更高的制作效率。当然动态网页可以由Database+脚本语言(JSP、ASP、PHP)+HTML+CSS组成;同样基于XML的动态网页可以由Database+中间程序(提取数据库内容形成XML文档)+XML+XML Schema+XSL组成。基于XML的解决方案同样保持了层次清晰的优点。
对于XML和数据库的比较,我的上一篇文章中有过讨论()。从本质上来说,XML和数据的本质差不多,都是围绕着数据来提供一系列的解决方案,但是它们之间存在几个显著的不同:1.XML是轻量级的数据解决方案,容易学习,可以用文本编辑器进行编辑,一般的浏览器都支持XSLT,适用于数据量小的各种环境;2.XML是完全平台无关的,不需要依赖于特定的操作系统、浏览器或者编程语言,而数据库不是完全平台无关的;3.XML是基于文本的,适合于网络传输,你不能指望每个EJB的配置文档都用数据库来表示吧;4.XML和数据库是可以互相结合和转换的。
对数据的不同理解可以将XML应用到不同的方面。你可以这样理解:XML是数据库中的数据;Schema是数据库的表;XSL是显示数据的程序;也可以这么理解:XML是网页素材;Schema是素材的数据结构;XSL是素材的显示特性。同样,在软件建模方面,也可以用XML来替代UML。这是基于这么一种理解:Schema代表类图,它如同UML一样存储了类的结构特性;XML代表对象,它存储了类的实例化对象的属性数据;而XSL是对类图的转换,即MDA(Model Driven Architecture,模型驱动架构)中的提到的模型转换。在UML中没有模型转换技术,但是一些UML工具提供了代码生成的功能(例如RationalRose),这中功能可以理解为模型转换的一个特例。因此有人提出了用XSLT做代码生成的建议,事实上这种代码生成技术已经比较成熟。由于XML Schema并不是天生就用来刻划类图的,所以它在类的继承等方面存在一些不足之处,为了修正这些不足,OMG(Object Manage Group,对象管理组)组织提出了XMI(XML Metadata Interchange,XML元数据交换)标准,用来补充XML Schema在软件建模方面的不足。现在XMI已经变成了各种软件建模工具的通用存储方式,可以将不同建模工具建立的模型互相转换。
总的来说,XML是一种基于文本的、格式化的数据存储技术,它包括一系列的数据解决方案,它们是轻量级的、易于学习的、平台无关的数据解决方案。弄清楚了这个概念再去学习XML,也许更有帮助。