XML来自何处?
XML起源于SGML(Standard Generalized Markup Language。换句话说,你可以既使用XML也可以使用SGML来创建自己的描述性文档。这两种语言都使用文本标识(Tags)来描述数据以供其他应用或是工具(例如一个SGML或是XML分析程序)使用。有了XML,它们可以正确的读取信息并对数据进行一些有趣的操作。XML是SGML的一个简化版本,它更适合于在Web上使用。
XML的语法
XML定义了用来描述你的数据的语法。一下就是一句正确的XML语句:
<hamburger name="CowBurger" lowfat="dream on"/>
和其他的标识语言有所不同,XML对大小写是敏感的。所以,<hamburger>元素和<Hamburger>元素在XML中是不同的。同时,XML不会忽略空格(其他的语言常常忽略空格)。对每一个可能对文档结构造成混淆的字符,XML都会仔细的处理(就像< and >)。
如果一个XML文档只含有一个根元素,并且所有的子元素都被正确地放在父元素中,这样的XML具有良好的风格。更具体地说,就是对每一个给定的子元素,它的begin和end tag都只存在于相同的父元素中。下面就是一段风格良好的XML文档示例(hamburger.xml)。
<?xml version="1.0"?> <hamburgers> <hamburger lowfat="dream on"> <name>CowBurger</name> <description>Greasy and good.</description> <price>2.99</price> </hamburger> </hamburgers> |
谁来定义Tags?
读了前面的部分后,你会发现你已基本上了解了XML的语法。其实这里的内容并不是很多,XML确实是非常简单。
可能你已经注意到了,XML看起来很像HTML(Hypertext Markup Language)。他们都用相同的语法来定义begin和end tag以及一些属性。从本质上说,HTML使用的是一些预先设定好的元素和方法,只是XML的一个特例。这些元素及其相关的方法决定了浏览器如何解释一个XML文档,进而提供给最终用户。
和HTML为创建用户界面提供了一种通用的方法一样,XML提供了一种描述并协同数据工作的通用方法。XML允许开发者创建自己的XML词汇,用自定义的方式描述他们自己的数据结构。假如一个开发者正在为一个快餐连锁店开发软件,那么,为了描述一些食品,一个"汉堡包"元素可能会十分的方便。
一旦开发者使用了XML来描述他们的数据,他们就可以很方便的在相同的或是不同的系统中对这些数据进行互操作。当然,前提是那些系统都能理解XML。譬如说,一位开发者可以使用来自另一个系统的数据,只要那些数据是用XML描述的。如此一来,开发者在考虑软件的互操作性时就再也不必担心诸如平台、操作系统、语言、或是数据存储等各方面的不同了。XML是实现系统之间互操作性的最简单工具。
<?xml version="1.0"?> <hamburgers xmlns:purchase="http://fastfood.org/franchise/prices" xmlns:sales="http://fastfood.org/customer/prices" > <hamburger lowfat="dream on"> <name>CowBurger</name> <description>Greasy and good.</description> <purchase:price>0.99</price> <sales:price>2.99</price> </hamburger> </hamburgers> |
我怎样使用XML呢?
XML的语法并不难,但想要用好XML,让它帮我们做一些事还是有一定的挑战性的。
要用好XML,我们要能编程处理XML文件。W3C定义了一种软件模型叫"XML处理器"。它能够读XML文档并提供对其内容和结构的访问。微软最主要的XML处理器叫做Microsoft XML(MSXML) 2.0。MSXML 2.0 捆绑于IE 5.0中,并且可以作为一个单独的可分发文件从微软MSDN XML的网站免费获得(http://msdn.microsoft.com/xml)。
使用XML来作为描述数据的通用标准的一个主要优点在于,任何XML处理器所提供的功能都能让我们实现我们想到的目标。开发者几乎不用(如果你曾这么干过)费力去写自己的XML处理器。理论上说,开发者应该使用市场上最好的处理器以避免出现兼容的问题。
使用一个标准的XML处理器,你可以通过编程读各种XML文档(例如hamburger.xml),访问任何元素、元素内容或是元素属性。如果你在一个基于Windows的系统中创建XML文档,你也可以很方便的将这个文档转到大型机系统中,用大型机的XML处理器来实现与同样数据的交互。这才是XML的真正魅力所在。作为一项技术,XML并不能解决你的软件的所有问题;但它已成为一种在你和他人的应用之间交换结构化数据的开放式有效机制。
XML的核心技术
直到现在,你已经完全可以创建使用属于你自己的XML文档了。然而,XML真正的潜力却在于它所支持的多项技术。你完全不必为此去使用本文以下所讨论的所有技术。但它们的出现可以帮助你理解这些技术是怎样作为整个XML策略的一部分被组合在一起的。
确认技术
你已经知道了XML为描述结构良好的文档提供了一整套灵活的语法。正因为它的这种灵活性,我们需要一些方法来确认某一种特殊类别的XML文档都有我们所预计一种格式。例如,以下就是一个结构良好的XML文档:
<?xml version="1.0"?> <hamburgers> <hamburger lowfat="dream on"> <hamburger lowfat="maybe"> <name>CowBurger</name> <description>Greasy and good.</description> <price>2.99</price> <price>3.99</price> </hamburger> </hamburger> </hamburgers> |
然而,这个文档有一些应用级的问题。注意到了吗,文档中一个hamburger元素出现在了另一个hamburger元素的里面。请别担心,对于这个例子来说这个XML结构没有任何的错误。另外,请注意在里层的hamburger元素中有多个price元素。哪一个price是正确的呢?系统有可能会显示出这里有一个Bug。在这种情况下,一个标准的确认XML文档的机制将是十分有用的。
<!ELEMENT hamburgers | (hamburger)*> |
<!ELEMENT hamburger | (name, description, price)> |
<!ATTLIST hamburger | lowfat CDATA #IMPLIED> |
<!ELEMENT name | (#PCDATA)> |
<!ELEMENT description | (#PCDATA)> |
<!ELEMENT price | (#PCDATA)> |
这篇文档指出,hamburgers元素可以包含多个hamburger元素。同时,每一个hamburger元素必须包含一个lowfat属性和三个子元素,所有的类型都是#PCData(parsed character data)。遵从这篇DTD的文档都必须加入下面一行代码:
<!DOCTYPE hamburgers SYSTEM "hamburger.dtd">
这句声明告诉分析器不论DTD中的schema是什么都认为XML文档的内容是合法的
尽管MSXML 2.0支持DTDs,但是你还是会发现使用它们是很费力的。它非常复杂并且难于掌握与使用。请注意,DTD语法并不是合法的XML。正因为如此,XML的处理器除了XML语法,还要支持用来描述schema的DTD语法。设想一下,假如我们用XML来描述schema,那么开发者,特别是XML工具的提供者,所承担的XML文档检验工作将会变得容易得多。W3C正在考虑几种弥补DTDs不足的方案以提高现在的语法定义过程。
XML数据
XML-Data是一种XMLschema语言。在微软的定义中,XML-Dataschema通常是指XMLschema,而不是DTDschema。一个XML-Dataschema是一个具有良好结构的XML文档。XML-Data语言基于XML-Data DTD,后者指明所期望的schema定义格式。因为XML-Dataschema是简单的XML文档,任何用于XML文档的工具都可以用来定义XML-Dataschema。
以下的XML-Dataschema产生的schema和先前由hamburger.dtd所定义的schema是一样的:
<?xml version="1.0"?> <Schema xmlns="schemas-microsoft-com:xml-data"> <ElementType name="name" /> <ElementType name="description" /> <ElementType name="price" /> <AttributeType name="lowfat" /> <ElementType name="hamburger" /> <element type="name" maxOccurs="1" /> <element type="description" maxOccurs="1" /> <element type="price" maxOccurs="1" /> <attribute type="lowfat" maxOccurs="1" /> </ElementType> <ElementType name="hamburgers" model="closed"> <element type="hamburger" maxOccurs="*" /> </ElementType> </Schema> |
在XML-Dataschema中定义元素和属性时,分别用到的是<ElementType>和<AttributeType>元素。它们提供了对元素和属性类型的定义。定义一个元素或是属性时用<element>或<attribute>标签。你可以通过定义minOccurs/maxOccurs来指定元素允许出现的数量。schemaXML结构还定义了元素在XML文档中允许出现的位置(例如一个<hamburgers>元素可以包含若干<hamburger>元素,等等)。
微软通过MSXML 2.0对XML-Data提供支持。根据微软的XML SDK文档,捆绑在IE 5中的XMLschema的实现基本上依托于W3C于1998年1月发布的XML-Data Note。它提供了对XML-Data子集的支持,这虽然和XML的语法稍有不同,正好直接和DCD中阐明的功能相吻合。
Set xmlDoc = CreateObject("MSXML.DOMDocument") bSuccess = xmlDoc.load("hamburger.xml") If bSuccess Then For Each node in xmlDoc.documentElement.childNodes val = node.text Next End If |
SAX
DOM标准的一个主要不足在于将整个XML文档装入内存所引起的巨大开销。当文件的数据量非常大时,这会给我们带来一些问题。当你在内部网或是因特网上传输如此巨大的XML文件时,你可能等不及所有的文件传输结束就开始处理数据。很多XML的开发者已经意识到这一点,于是他们一起努力(从XML-DEV邮件列表开始)开始创立另一种新的标准。这就是SAX。虽然SAX还处于发展的初期,但因为它出色的性能,它正快速的得到大家的欢迎。
SAX是一种非常简单的XML API(正如它的名字那样,Simple API for XML),它允许开发者使用事件驱动的XML解析。与DOM不同,SAX并不要求将整个XML文件一起装入内存。它的想法十分的简单,一旦XML处理器完成对XML元素的操作,它就立刻调用一个你自定义一个事件处理器及时的处理这个元素和相关数据。这样做虽然能极大的提高效率,但也会造成一定的问题。比如说,开发者将不得不在灵活性上受到限制。
XSL Patterns
一个模式就是一个字符串,通过它来选取XML树中的节点。这样的选取取决于模式所关连的当前节点。元素的名字是最简单的模式,这个模式选取了当前节点所有具有该名字的子节点。例如,hamburger模式选取了当前节点的所有hamburger子节点。
模式的语法非常完备。它允许你标识某个指定元素在文档中所处的上下文(例如,price元素在hamburger元素之中),同时它还提供了强大的筛选句法,使得我们可以标识出符合给定条件的节点(例如,lowfat=yes)。为了找出一个hamburgers元素中的所有lowfat hamburger price元素,你可以使用以下的模式字符串:
/hamburgers/hamburger[@lowfat="yes"]/price |
当某个模式被应用于给定的节点时,它仅返回符合指定模式的节点列表。这大大简化了开发者的操作,不再需要遍历整棵树。
MSXML 2.0对模式语法的支持和Extensible Stylesheet Language (December 18th Working Draft)中2.6节的定义是相同的。MSXML 2.0中的IXMLDOMNode接口提供了两个方法,SelectNodes和SelectSingleNode。这两个方法都以一个模式串为参数。例如,下面的一行代码将返回满足条件的所有price节点。
Set nodeList = rootNode.selectNodes("hamburger[@lowfat="yes"]/price")
XSL
XSL模式可以帮助我们标识一篇给定XML文档中的某些节点,但对这些节点的操作最终还是有赖于开发者来完成。XSL可以帮助我们简化完成通常XML任务的过程:将XML节点从一种格式转化到另一种格式。这种对格式转化的需求起源于Web开发者需要将他们的XML数据转化为HTML数据以供用户浏览。
实际上,XSL所能做得远比以上描述多得多。XSL能够有效的定义从一种XML格式到另一种XML格式之间的转换,这极大的增强了互操作性。假如某个人向你的系统发送了一篇XML文档,而你的系统不认识它所采用的XML词汇,你只要进行一次简单的XSL转换就可以得到自己熟悉的词汇。正是由于XML这种简单的特点,开发者才不用为了描述某种类型的数据而采用通用的词汇。
一个XSL文件中包含了一系列定义转换规则的声明模板。每一个模板都明确定义了怎样将源文档中的指定节点转换为输出文档中的节点(或其它类型的数据)的方法。你可以使用XSL模式来决定一个模板应用于一篇文档中的那些部分。
作为一个示例,下面转换hamburger XML文件:
<?xml version="1.0"?> <hamburgers> <hamburger lowfat="dream on"> <name>CowBurger</name> <description>Greasy and good.</description> <price>2.99</price> </hamburger> </hamburgers> |
转换到HTML文件:
<html> <body> <h1>hamburgers</h1> <ol> <li>CowBurger, $2.99, Greasy and good.</li> </ol> </body> </html> |
你使用的XSL文件如下:
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl=" http://www.w3.org/TR/WD-xsl "> <xsl:template match="/"> <html> <body> <h1>hamburgers</h1> <xsl:for-each select="hamburgers[@lowfat="dream on"]> <li><xsl:value-of select="name"/>, <xsl:value-of select="price"/>, <xsl:value-of select="description"/></li> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet> |
注意到了吗,我们是怎样在不同XSL元素的match和select属性中使用XSL模式来标识元素集的?在<xsl:template>标签中定义了一组节点的转换规则。XSL使用了一套标准的XML词汇来定义转换的过程,是不是很有趣呢?
<hamburger xml:link="simple" HREF = "http://fastfood.org/hamburger.asp"> </hamburger> |
其他XML相关的技术和词汇
目前为止我们所谈到的已经代表了XML的核心技术。可能你觉得这些东西已经足够了,但如果我们不深入下去对眼下一些正流行起来的XML相关技术和词汇作一些介绍的话,这篇文章探讨XML的文章就显得不是很完整了。目前,这些新技术正在W3C的开发小组的努力下一步步走向成熟。
MathML(Mathematical Markup Language)
MathML是一种用来描述数学符号、纪录其结构和内容的XML应用。MathML的目标是在Web上实现能像HTML处理文本一样,处理数学问题。下面是由W3C提供的的MathML例子。数学方程:
x2 + 4x + 4 =0
在MathML中可以用以下的XML词汇表示:
<apply> <plus/> <apply> <power/> <ci>x</ci> <cn>2</cn> </apply> <apply> <times/> <cn>4</cn> <ci>x</ci> </apply> <cn>4</cn> </apply> |
<HTML> <HEAD> <STYLE> .time { behavior:url(#default#time); } </STYLE> </HEAD> <BODY> <DIV CLASS="time" t:timeline="seq"> <P class="time" t:dur="1"> This appears for one second and goes away </P> <P class="time" t:dur="1"> This appears after one second, remains visible for one second and goes away </P> <P class="time" t:dur="1"> This appears after two seconds, remains visible for one second and goes away </P> </DIV> </BODY> </HTML> |
<v:shape style='top: 0; left: 0; width: 250; height: 250' stroke="true" strokecolor="red" strokeweight="2" fill="true" fillcolor="green" coordorigin="0 0" coordsize="175 175"> <v:path v="m 8,65 l 72,65,92,11,112,65,174,65,122,100,142,155,92,121,42,155,60,100 x e"/> </v:shape> |
总结
除了上面我们列出的技术,XML相关的技术还有很多。我们将把对这些技术的探索留给你自己去完成。相信你已经感到,在XML及其相关技术发展的背后,有着巨大的、整个行业范围内的努力在支持者它。
XML必将改变我们未来开发互操作性软件的世界。如果想进一步了解XML对软件组件技术的影响,请看Lessons From the Component Wars: An XML Manifesto(http://msdn.microsoft.com/library/en-us/dnxml/html/xmlmanifesto.asp)
想要深入学习有关XML的大量信息是比较困难的,人们往往很难看清所有这些东西是怎样融合为一个整体的。这篇文章向你介绍了XML和它相关的一些技术。到目前为止,你已经大致明白了XML技术是什么以及这些核心技术是怎样整合在一起的。也就是说,你已经为今后进一步学习XML做好了准备!
……