XML及其技术指南
2009-01-02 14:30:00   来源:   评论:0 点击:

概要:本文介绍了XML以及XML家族中的各项技术。我们将讨论这其中的各项核心技术是如何组合成一个完整的整体以及一些支持XML技术的东西究竟是什么。

 
  似乎这样的事情每天都在发生:越来越多的开发者都相信XML(Extensible Markup Language)将从根本上改变我们的软件业。但如果你想从他们那里弄清楚这一切为什么或是何时将会发生时,你会发现他们给的解释中充斥着大堆有关XML的专有名词的缩写。这些东西实际上并不能让你明白些什么,我相信你一定不会满意像他们这样的解释。

  通常,人们在学习掌握XML时所遇到的主要障碍来自于XML惊人的发展速度。如果你浏览一下W3C关于XML的网站(http://www.w4.org/xml/),你会发现有关XML的大量技术以及相关的出版物。W3C将如此大量的信息聚集在一起,给开发者造成了不小的麻烦。在对"XML所含盖的所用技术是如何整合在一起"这样关键性的问题还没用明确概念的情况下,想要学习XML是比较困难的。

  本文向你介绍了XML和XML家族中的各项技术,使你不仅在更高层次上对XML的重要性有所了解,而且知道XML中的各项技术是如何组合在一起成为一项完整的技术。读完本文,你会将会对困扰你的那些XML专用名词及其缩写用一个大致的了解,为你今后从更深层次学习XML打下基础。

  那么,究竟什么是XML呢?

  在很多介绍以前的XML的作者中,回答这个问题已经成为了一种风潮。就像你已经熟知的一样,XML是Extensible Markup Language的正式缩写。他们可能认为XML的发音比EML读起来更性感,于是就将原先的字母E换成了字母X。然而,当你跨过缩写从更深层次上来理解XML时,你会发现它不仅仅是一种标记语言,而是一系列的技术。这一技术家族为我们开发具用更好的可扩展性和互操作性的软件提供了一种解决方案。

  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的名字空间

  由于XML对互操作性的支持,每个人都可以创建属于自己的XML词汇。这样一来,如果不同的开发者用相同的元素来代表不同的实体的话,后果是不可想象的。为了防止这种潜在的冲突,W3C在XML中引入了名字空间。

  XML名字空间为你的XML文档元素提供了一个上下文。它允许开发者按一定的语义来处理元素。还以汉堡包举例说明,在某个系统中price元素可能代表的是消费者的购买价,而在另一个系统中,它可能代表了商店的进货价。下面的例子演示了名字空间是怎样帮我们解决这样的问题的。

<?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并不能解决你的软件的所有问题;但它已成为一种在你和他人的应用之间交换结构化数据的开放式有效机制。
||||||处理器(API)技术

  我们在前面已经提过了,为了有效的使用XML,你必须通过编程来访问数据。我们将一个能访问XML文档同时又能提供对其内容和数据结构进行访问的软件模块称为一个XML处理器或是一个XML API。

  虽然开发者完全有自由去开发或使用他们自己的XML API,但从他们的利益出发,我还是建议他们使用行业标准的API。因为只有接受了行业标准的API,开发者写出的代码可以无需修改便能在其他的环境中顺利执行。

  目前有两种主要的API已经得到了广大开发者的广泛使用,即将成为未来的行业标准。它们分别是:DOM(Document Object Model)和SAX(Simple API for XML)。

  DOM 文档对象模型

  文档对象模型是一种通过编程方式对XML文档中数据及结构进行访问的标准。W3C已经同意将其列为未来行业标准第一等级规范的推荐对象。

  DOM是基于XML文档在内存中的树状结构。当一个XML文件被装入到处理器中时,内存中建立起一棵相应的树(见图1)。DOM还定义了用来遍历一棵XML树和管理各个元素、值和属性的编程接口(包括方法和属性的名字)。



Figure 1. XML in-memory representation

  MSXML 2.0完全支持DOM并提供了一个易用的对象模型与内存中树进行交互。下面是一个简单的VB例子,它演示了如何用MSXML来遍历一颗树的所有子元素。

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元素的操作,它就立刻调用一个你自定义一个事件处理器及时的处理这个元素和相关数据。这样做虽然能极大的提高效率,但也会造成一定的问题。比如说,开发者将不得不在灵活性上受到限制。如果你想了解更为详细的资料,请访问http://www.megginson.com/SAX/sax.html。

||||||转换技术

  一旦你开始使用标准的DOM API来实现于XML数据的交互,你便会发现,无论是从一个大型的文档中取得一个特定的数据,还是将一个XML文档的某一部分转换为另一种格式的数据(例如HTML),都是十分单调乏味的。

  举个例子说,假如你想找到所有的lowfat hamburger price元素。为了用标准的DOM API来完成这一切,你必须通过手工地书写代码遍历整颗树来找寻符合条件的元素(在本例中,条件是指在hanburger元素中lowfat=yes的price元素)。再看另一个例子,假设你想将所用的hamburger元素和相关的数据转换为简单的HTML表格以供用户交互使用。使用标准的DOM API,你得手工遍历整棵树来获得HTML表格中所需的数据。

  我为了标准化及简化人们完成这些任务所需做的工作,W3C推荐使用XSL(Extensible Stylesheet Language)和一种叫做XSL Patterns的简单查询语言。

  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词汇来定义转换的过程,是不是很有趣呢?

|||||| 链接技术

  很多人都认为,HTML真正强劲的地方在于它的锚元素。

  <A HREF = "http://www.someserver.com">some link</A>

  锚元素使开发者可以建立从一个HTML页面到另一个页面的链接,定义两个文档之间的关系。这给用户提供了一种从当前页面中获取更多相关数据的途径。同时,这也是用户在查询数据中所使用的典型方法。为了查找数据,他们浏览某一页面,同时他们在这篇该页面中可能会发现更符合他们要求的内容。而这些内容通过一个链接,存放在不同的页面上。

  整个Web就是基于这样一个在不同的数据文件之间建立关系(链接)的基石上的。随着IT行业不断的向前发展,我们自然会想到用类似的机制来描述不同XML文档或是相同文档中不同元素之间的联系。

  XLink

  XML Linking 1.0 (XLink)是W3C主导的定义XML链接的语法。根据XLink 1.0文档的要求,一个XML链接,或XLink的描述信息,显式的指定了资源或部分资源之间的关系。在XLink中,我们并不涉及标示不同类型数据位置的方法(例如URIs、XPointers和图形坐标)。

  这里是一个XML连接的简单例子:

<hamburger xml:link="simple" HREF =
  "http://fastfood.org/hamburger.asp">
</hamburger>

  XPointer

  在前面的章节中你已经读到,XLink需要依靠不同的机制来标识你想要链接的资源(例如统一资源标识符)。W3C推出了另一种叫做XPointer的机制用于构造XML文档的内部结构。具体地说,它决定了一篇XML文档中的元素、字符串或其它部分是否具有某个具体的标识。

  一个XPointer包括一系列描述位置的术语,它们中的任何一个都指定了一个特定的位置信息,通常这样的位置信息总是和前一个术语所指定的位置信息相关联。每一个位置术语都有一个关键字(例如id,child,ancestor等等)和若干变量,诸如实例的序列号、元素类型或属性。看下面的例子:

  child(2,hamburger)

  指的是第二个类型为hamburger的元素。
|||||| 链接技术

  很多人都认为,HTML真正强劲的地方在于它的锚元素。

  <A HREF = "http://www.someserver.com">some link</A>

  锚元素使开发者可以建立从一个HTML页面到另一个页面的链接,定义两个文档之间的关系。这给用户提供了一种从当前页面中获取更多相关数据的途径。同时,这也是用户在查询数据中所使用的典型方法。为了查找数据,他们浏览某一页面,同时他们在这篇该页面中可能会发现更符合他们要求的内容。而这些内容通过一个链接,存放在不同的页面上。

  整个Web就是基于这样一个在不同的数据文件之间建立关系(链接)的基石上的。随着IT行业不断的向前发展,我们自然会想到用类似的机制来描述不同XML文档或是相同文档中不同元素之间的联系。

  XLink

  XML Linking 1.0 (XLink)是W3C主导的定义XML链接的语法。根据XLink 1.0文档的要求,一个XML链接,或XLink的描述信息,显式的指定了资源或部分资源之间的关系。在XLink中,我们并不涉及标示不同类型数据位置的方法(例如URIs、XPointers和图形坐标)。

  这里是一个XML连接的简单例子:

<hamburger xml:link="simple" HREF =
  "http://fastfood.org/hamburger.asp">
</hamburger>

  XPointer

  在前面的章节中你已经读到,XLink需要依靠不同的机制来标识你想要链接的资源(例如统一资源标识符)。W3C推出了另一种叫做XPointer的机制用于构造XML文档的内部结构。具体地说,它决定了一篇XML文档中的元素、字符串或其它部分是否具有某个具体的标识。

  一个XPointer包括一系列描述位置的术语,它们中的任何一个都指定了一个特定的位置信息,通常这样的位置信息总是和前一个术语所指定的位置信息相关联。每一个位置术语都有一个关键字(例如id,child,ancestor等等)和若干变量,诸如实例的序列号、元素类型或属性。看下面的例子:

  child(2,hamburger)

  指的是第二个类型为hamburger的元素。
||||||总结

  除了上面我们列出的技术,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做好了准备!

  参考内容

  W3C规格和推荐阅读材料

  · Extensible Markup Language (XML) 1.0 (W3C Recommendation)

  · Namespaces in XML (W3C Recommendation)

  · XML-Data (W3C Note)

  · XML-Schema Part 1: Structures (W3C Working Draft)

  · XML-Schema Part 2: Datatypes (W3C Working Draft)

  · Document Object Model (DOM) Level 1 Specification

  · Resource Description Framework (RDF) Model and Syntax Specification

  · XML Pointer Language (XPointer)

  · XML Fragment Interchange Requirements Version 1.0

  · Mathematical Markup Language (MathMLTM) 1.01 Specification

  · XML XLink Requirements Version 1.0

  · Vector Markup Language (VML)

  · XHTMLTM 1.0: The Extensible HyperText Markup Language

  · Channel Definition Format (CDF)

  书

  · XML In Action, by William J. Pardi, available at Microsoft Press. ISBN:0-7356-0562-9

相关热词搜索:

上一篇:XML在B/S架构开发中的应用
下一篇:学习使用XML引擎XQEngine

分享到: 收藏
频道总排行
频道本月排行