XML Litmus 测试

了解使用 XML 的时机与原因

Dare Obasanjo
Microsoft Corporation

摘要:Dare Obasanjo 提供了一些简要的指南,用于说明 XML 在哪些情况下可以作为适当的技术应用到软件应用程序或体系结构设计之中。

简介

随 着 XML 普及程度的提高,它的使用范围已经遍布于软件应用程序开发的每一个角落。究其原因是它与以前的数据格式不同,XML 不仅可以容易地表示严格且高度结构化的数据(例如,数据库中的关系数据、程序配置文件或电子表格),而且还可以表示半结构化的数据(例如,Web 页或商业文档)。除了能够表示结构化和半结构化的数据之外,XML 还有许多特征,这些特征促使 XML 成为被广泛采用的数据表示格式。通过对 Unicode 的完全兼容,XML 具有可扩展性、平台无关性并支持国际通用性。XML是基于文本的格式,这意味着需要的时候可以使用标准的文本编辑工具阅读和编辑 XML 文档。这从而使 XML 作为信息交换的国际商业通用语言而被广为采用。

这一普及程度意味着在某些情况下,即使 XML 不是进行数据表示的最佳工具,但还是会选择它作为数据表示格式。本文提供了一套清晰的指南,用于确定在特定情况下,XML 在什么时候可以作为数据表示的正确选择。此外,本文还说明了一些适合和不适合使用 XML 的示例。

XML Litmus 测试

在我的 Understanding XML 一文中,已论述了使用 XML 作为数据表示格式的一些好处。由于对 XML 的广泛支持可以跨不同的软件平台,与大多数其他的数据表示格式相比,使用 XML 的主要好处是:在使用 XML 的不同平台上的应用程序间可以更容易地进行互操作。使用 XML 的第二个主要好处是由它的普及程度所带来的负产品。即,有大量现成的工具可以用来处理 XML(包括分析器、架构语言、查询语言、编程模型和编辑器,等等)。再没有别的数据表示格式能够有这么多的工具来处理如此众多的平台上的格式实例。

由上述这些好处为我们引入了 XML Litmus 测试。对于给定的应用程序,选择 XML 作为数据表示格式,如果符合下列条件,那么 XML 就是适合进行数据表示的工具:

  1. 需要在多个软件平台之间进行互操作。

  2. 生成或使用数据时,可以利用一个或多个用来处理 XML 的现成工具。

  3. 分析性能并不至关重要。

  4. 该内容基本上不是二进制内容,例如,音乐或图像文件。

  5. 该内容不包含控制字符,即不包含回车、换行符或制表符,因为它们在 XML 中是非法的。

如果期望的使用方案不能满足上述条件中的至少四条,那么对于当前的方案来说,使用 XML 作为数据表示格式可能意义不大。

即使 XML 的使用符合条件,但仍然需要进行权衡。例如,因为 XML 是基于文本的格式并使用冗余标记来标注内容,所以经常有人抱怨由于将 XML 选作数据表示格式而引起的诸多繁琐 问题。但是,XML 会在互操作性、大量描述并处理数据的技术方面给我们带来好处,在这种情况下,就要进行权衡。使用 XML 作为网络协议(如 XMPPSOAP)的基础的确是个平衡方案。

另 一个也需要权衡的领域就是将 XML 用作应用程序配置文件格式。从表面上看,相对于绝大多数应用程序配置文件的需求,XML 要复杂得多。在大多数情况下,这就是事实。但是,XML 大大有利于表格处理。这些好处包括国际化、用于创建注释和转义文本的内置机制,以及用于使用和生成 XML 的广泛部署的工具。往往存在这样一个事实:编写自定义配置文件格式的分析器(或者其他工具)的成本超过了由 XML 简单格式带来的所有好处。权衡这些因素,在处理应用程序配置文件时,XML 通常(但并非总是)是进行数据表示的合适工具。

本文剩余部分的内容涉及对于大量已建立的 XML 使用情况下的 XML Litmus 测试。

适于使用 XML 的情况

最初设计 XML 语言的目的是为了万维网而定义的新的文档格式。XML 是从标准通用标记语言 (SGML) 派生而来的,可以将它视为一种元语言,也就是定义标记语言的语言。在 Web 上使用 XML 的好处不言自明。在分布广泛的全球性网络上(如万维网),跨平台的互操作性是关键,因为对 Unicode 的兼容,所以 XML 完全支持国际通用性。

目前,XML 在 Web 上最普遍的用法是用于 XML Syndication Feeds(如 RSS 1.0RSS 2.0)。下面是 RSS 2.0 Feed 的示例。

<rss version="2.0">
<channel>
<title>MSDN XML Developer Center</title>
<link>http://msdn.microsoft.com/xml/</link>
<description> Extensible Markup Language (XML) is the universal
format for data on the Web. XML allows developers to easily
describe and deliver rich, structured data from any application
in a standard, consistent way. XML does not replace HTML; rather,
it is a complementary format.
</description>
<item>
<title> XML Files: XPath Selections and Custom Functions,
and More</title>
<link>
http://msdn.microsoft.com/msdnmag/issues/03/02/xmlfiles/TOC.asp
</link>
<description> Get your questions about XPath selections,
custom functions, and more answered in this month's column.
</description>
</item>
<item>
<title> Extreme XML: XML Serialization in the .NET Framework </title>
<link>
http://msdn.microsoft.com/library/en-us/dnexxml/html/xml01202003.asp
</link>
<description> Dare Obasanjo discusses XML serialization and how
you can use it within the .NET Framework to improve
interoperability and meet W3C standards.
</description>
</item>
</channel>
</rss>

将 XML 用作 Syndication Feeds 的数据表示格式通过了 XML Litmus 测试。互操作性和对国际通用性的支持是每个 Web 技术的目标,因此从这个意义上来说,使用 XML 作为内容 Syndication 的数据表示格式,其好处十分明显。其次,Syndication Feeds 基本上是文本内容,而且通常不包含大量的二进制数据或控制字符。最后,使用现成的 XML 技术可以构建许多应用程序以处理并显示 Syndication。例如,像 RSS Bandit 这样的桌面聚合器使用 XSLT 以显示利用多重布局的 RSS feeds。另一个示例是 MSDN Web 站点,它使用 XSLT 以一种人们可读的格式(如 RSS feed for the MSDN XML Developer Center 所示)向 Web 浏览器呈现 RSS feeds。

XML 使用日益广泛的另一个领域是作为商业文档的数据表示格式。不仅办公生产套件(如 Microsoft Office)开始使用 XML 作为其文档存储格式的基础,而且许多纵向产业也已经将 XML 架构标准化以进行信息交换。用于特定纵向产业中信息交换的标准化 XML 词汇的示例包括:人力资源方面的 HR-XML、医疗卫生行业的 HL7-XML、财务报告方面的 XBRL,等等。

在 使用 XML 来表示商业文档的过程中应用 XML Litmus 测试中的条件,也说明这是一种适合使用 XML 的情况。首先,因为商业文档基本上是文本内容,这样就满足了关于二进制数据和非法 XML 字符的条件。将商业文档与其他实体进行交换时,确保文档与平台无关是一个重要因素。这一点尤其重要,因为不同的商业实体不大可能在相同的平台上运行它们的 软件,或者即使一个特定的商业实体内部不同的组织也不大可能运行在相同的网络中。在典型的商业文档使用方案中,分析性能十分重要。毕竟,没有人希望字处理 器花几分钟的时间来加载一个文件,并且使用了 XML 无需过多的系统开销就可以弥补这种不足。最后,由于涌现出大量可用来处理 XML 的工具,从而使创建和管理商业文档工作流十分便捷。说明性架构语言(如 W3C XML 架构和 Schematron)可用于在进入或离开系统的商业文档上强制执行约束。XML 转换语言(如 XSLT)可以用于在不同的 XML 商业文档格式之间进行转换,或者将它们发布为非 XML 格式(如 HTML 或 PDF)。使用 XML 模式语言可以筛选并路由文档,例如,使用 XPath 可以找到具有感兴趣特征的文档。如此等等。

不适于使用 XML 的情况

我认为一种不适于使用 XML 的情况是将 XML 用作编程语言的语法,如在 o:XML 中所做的那样。考虑下面一个方法的 o:XML代码段,该方法有三个字符串参数并返回一个 date 元素。

<!-- procedure definition -->
<o:procedure name="ex:formatDate">
<o:param name="day"/>
<o:param name="month"/>
<o:param name="year" />
<o:do>
<date>
<day><o:eval select="$day"/></day>
<month><o:eval select="$month"/></month>
<year><o:eval select="$year"/></year>
</date>
</o:do>
</o:procedure>
<!-- procedure call -->
<!-- 'year' has a default value and so is optional -->
<ex:formatDate year="2002" month="'Aug'" day="31"/>

将该代码段与下面完成相同功能的 XQuery 表达式进行比较:

declare function ex:formatDate($day as xsd:string, $month as xsd:string, $year as xsd:string) 
as element(date)
{
<date>
<day>{$day}</day>
<month>{$month}</month>
<year>{$year}</year>
</date>
};
ex:formatDate("31", "Aug", "2002")

XQuery 版本没有 o:XML 版本那么冗长,但是它们执行相同的任务。那么,问题是 XML 带来的好处是否能够弥补 o:XML 中 formatDate 函数的繁琐。通过使用 XML Litmus 测试,我得到的答案是“否”。基于 ASCII 的文本格式语言(如 XQuery)的互操作性与创建使用相似标识符的等价语言相同,但使用 XML 就不一样了。其次,在无数使用 XML 的工具中,应用于 o:XML 的一个主要工具是现有的 XML 分析器,它使处理 o:XML 中的语言标记比分析 XQuery 更加容易。但是,与编写自己那一部分的语言分析器的人一样,以前我设计并实现了 SiXDML, 我承认创建编译器的大量工作和语言标记的处理没什么关系,但是与执行逻辑的关系却很大。所节省的开发时间仅仅是编写编译器全部工作量的一小部分。但是,如 果选择了 o:XML(而不是 Xquery),那么每一个使用语言的程序员现在就不得不处理更为复杂的语言的语法以及应付激增的繁琐。

小结

XML 是软件开发人员工具箱中的一种强大的工具,但是与所有的工具一样,它有自己擅长的和不擅长的领域。XML Litmus 测试为在软件应用程序或体系结构中使用 XML 权衡成本和收益提供了一套简要的指南。

Dare Obasanjo 是 Microsoft 的 WebData 工作组的成员,该工作组的任务是在 .NET Framework 的 System.XML 和 System.Data 命名空间、Microsoft XML 核心服务 (MSXML) 和 Microsoft 数据访问组件 (MDAC) 中开发组件。

有关本文的任何问题或意见,欢迎张贴到 GotDotNet 上的 Extreme XML 留言板

posted on 2009-04-28 11:24  starspace  阅读(286)  评论(0编辑  收藏  举报

导航