### XML 技术指南(1)

概要：本文介绍了 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 并不能解决你的软件的所有问题；但它已成为一种在你和他人的应用之间交换结构化数据的开放式有效机制。
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 文档的机制将是十分有用的。