关于 XML 应该做和不应该做的五个重要方面

如何正确地使用 XML

XML 是一种强大的技术,但是它也有可能被滥用。在本文中,我们将介绍 10 个基本的该做什么和不该做什么的规则,您可以按照这些规则以最佳的方法使用 XML。

XML 作为工具使用

常用缩略词

  • CDATA:字符数据
  • DOM:文档对象模型
  • E4X:ECMAScript for XML
  • IDE:集成开发环境
  • W3C:万维网联盟
  • XML:可扩展标记语言
  • XSLT:可扩展样式表语言转换

现在很容易碰到 XML。XML 的应用到处都有!但是当您仔细审视它时,您会发现它是一个非常强大的技术。IDE 能够帮助创建 XML 树。有一些验证技术能够保证 XML 代码是正确的。XSLT 是一个专门用于 XML 转换的语言。XML 的支持甚至被直接植入到语言的语法中,如 ActionScript 的 E4X。

但是,XML 也有缺点。它也可能被滥用。它可能很糟糕。它可能过于复杂。它可能定义不全。它可能难以处理。所以您应该如何简化这种强大技术的使用呢?在本文中,我将介绍 10 个关于应该做什么和不应该做什么的具体规则,它们能够帮助您采用正确的方式创建容易使用的 XML。


不要将 XML 作为文件名或根标签使用

我见过无数的将 XML 代码保存在使用 .xml 作为扩展名的文件中。这是毫无意义的。如果我只用 “cat” 命令查看文件,它不能告诉我任何有用提示。我所看到的就是一些 XML 标签。相反,要使用一些对于客户来说有意义的扩展名。而且这个扩展名一定要是与众不同的,那样在 Google 上搜索时,搜索引擎会返回相应的文档,或者使用您的 XML 文件格式的一些示例。

我发现的另一个 XML 使用问题是使用 <xml> 作为根标签。同样,这也无法给我任何提示。文件中有什么样的内容?如果这是一个联系人清单,那么根节点应该是 <contacts>。XML 对于人们来说是可读的,所以要使用一些与当前业务问题相关的标签名称和属性名称。如果根节点是 <contacts>,那么我会想到这个标签内部是一些 <contact> 标签,然后是一些 <name> 标签,其中有 <first><middle><last> 等等。


不要过于通用或者使用语言特有的结构

我认为 XML 是一个持久化格式。而且大多数语言都有以 XML 保存数据结构的方法。当然,如果您知道 XML 只有两种处理方式,即读和写,而且都使用的是同一种语言,那就最好。然而,情况并不总是这么简单。如果您的应用程序将一些内容写到一个文件,很可能某个用户或应用程序会采用其他语言来读取文件。

我处理这种问题的方法就是,删除 XML 中某种语言特有的结构。您是否经常看到 <data type="NSDate">07-18-2010</data>?什么是 NSDate?这是应用程序平台中表示日期的类名。所以,如果您换到其他的平台或者语言,会怎么样呢?您将需要实现一个转换层来处理 NSDate 标签,将它们转换成新平台所要求的格式。

要删除 XML 中某种语言特有的结构,并且使用一些简单的数据结构,如 <date>…</date>。这很容易理解,具有很好的可读性,而且不依赖于任何特定的语言或框架。

除此之外,另一个重要的经验就是不要编写太过于通用的 XML。清单 1 显示的就是这样一个例子。

清单 1. 通用的节点树
<nodes>
    <node type="user">
        <node type="first">jack</node>
    </node>
</nodes>

这表单是什么意思?我的理解是这是一个用户清单。但是人们要读懂它并不是很容易,而且它也不利于编辑。最大问题是我们实际上很难使用一些 XSLT 工具处理这个 XML,也很难使用一个模式对其进行验证。这个 XML 实际上表示的是像 清单 2 的信息。

清单 2. 优化后的节点树
<users>
    <user>
        <first>jack</first>
    </user>
</users>

这是不是更好一些?它直观明了。它很容易读取和解析。它也很容易使用 XSLT 进行验证和转换。甚至它更小一些。


文件不要太大

现在我知道您可能会说:“磁盘很便宜。10 美分就可以购买上 TB 的空间。”这的确是事实。而且,您确定能够创建一个 GB 级的 XML 文件。但是编程讲究的是平衡。您使用较大的空间是为了换取处理时间;内存与时间也有一样的关系。但是,如果您有一个很大的 XML 文件,您会失去这个平衡。磁盘中的文件很大,但是其解析和验证的时间也很长。使用大文件就意味着无法使用基于 DOM 的解析器,因为创建树的时间会很长,而且需要消耗大量的内存。

那么有其他方法吗?其中一个可能的方法就是将它分成多个文件。其中一个文件作为索引,而其他文件则包含大量可能不为所有 XML 客户端使用的资源。另一种方法是将 XML 中大块的 CDATA 删除,然后使用各自格式单独保存到各自的文件中。如果您希望将所有数据放在一起,那么您可以将所有文件压缩打包到一个新文件,并使用新的扩展名。所有流行的语言都有简单的快速压缩和解压缩文件的模块。


除非真有必要,否则不要命名空间

命名空间是一个强大的 XML 功能。它们可以很容易实现一个扩展的文件格式。您可以定义您应用程序所需要的一组标签,然后允许客户将他们自己的数据以自己的命名空间添加到文件中,而不破坏您的节点树。

这就是说,命名空间增加了数据的解析和管理难度。命名空间也会使一些语言扩展变复杂,如 E4X。它们增加了在 XSLT 中使用 XML 的难度。而且,它们也增加了 XML 的阅读难度。

所以,只有在必要时才使用命名空间。不要因为它是 “XML 的一个功能” 就随意使用它。XML 不需要命名空间也能够正常工作。


不要使用特殊字符

所有这些应该做和不应该做的规则都是为了保持 XML 的整洁、简单和使之容易理解。本着这一精神,即使 XML 规范中允许的一些操作,您也不一定要使用它们。例如,您可能会在元素和属性名称上使用斜杠。但是这会增加在语言扩展中使用这个 XML 的难度,如 E4X。问题是,这样做是否值得?

我的建议是避免在元素或属性名称上使用特殊字符。


要使用 XML 模式

解析 XML 是很难的。为了安全地解析 XML,我们一定要对那些可能查找不到标签或属性的代码进行正确的错误处理,这需要很大的工作量。它会增加代码行数,增加复杂度,而且会增加您真正关注的业务逻辑代码的阅读难度。那么您应该如何避免这个问题呢?您应该在使用 XML 之前对其进行验证。您可以指定一个 Document Type Definition (DTD) 或者 XML Schema(请查看 参考资料,了解更多关于 DTD 和 XML Schema 的信息。)。我个人觉得 XML Schema 更容易处理,但是如果您刚接触它,那么我建议您尝试其他一些验证系统。

它的最大优点是一旦验证了一个 XML,那么您就可以信任这个 XML。为您的应用程序的方方面面重复地生成内部读写代码可能是不值得的。但是如果这个 XML 是由另一个应用程序或者手动编写的,那么就很方便。


要使用版本号

我们很容易忽略一个事实,那就是存储 XML 的文件是具有特定文件格式的。不管是何种格式,它首先应该包含的信息就是文件版本号。这个版本号是很容量添加的;如,<customers version="1">...</customers>。而读取文件的代码应该检查这个版本号,以保证版本号小于或者等于当前版本,否则就会抛出一个异常。这将会保证后续版本的代码不会因为增加的新标签而与旧版本混淆。当然,您在继续开发应用程序时必须支持所有旧版本的文件。


要组合使用节点和属性

工程师们都是会偷懒的。我这样说,是因为我自己也是这样的。大家都是这样。如果一个框架说它能够为我们导出 XML 文件,我们很可能就会认为 “这已经够好了。”但是创建 XML 的框架通常都不怎么样。例如,您很可能会得到如 清单 3 所示的代码:

清单 3. 一个用户清单
<users>
    <user>
        <id>1</id>
        <first>jack</first>
    </user>
</users>

那么 <id> 确实需要变成一个标签吗?我认为它更应该变成一个属性。因为这很短,而且能够使用一些简单的 XPath (/users/user[@id=1]) 查询一个用户。

如果想要提高它的可读性,那么它应该像 清单 4 那样合理地使用属性。

清单 4. 优化的用户清单
<users>
    <user id="1">
        <first>jack</first>
    </user>
</users>

我知道这个框架为什么会生成 清单 4 所示的代码,因为总是使用节点会更保险些。但是属性使您能够确定 DOM 树中的一些重要元素,所以您应该使用属性。


要使用 CDATA,但不要滥用

XML 对一些字符有特定的限制;引号、与号、小于号、大于号等。然而,在实际操作中,您会使用很多这样的字符。所以您或者需要以 XML 支持的编码对它们进行转换,或者需要将一大段的文本、代码或其他内容放到 CDATA 块中。我认为开发人员会避免使用 CDATA,因为他们认为这会增加解析的难度。但是 CDATA 的解析难度不会比其他元素大,而且大多数 DOM 解析器会直接帮您扁平化,这样您就不需要考虑它的差异。

使用 CDATA 的另一个重要的原因是保留数据的实际格式。例如,如果您想要导出一些 Wiki 页面,您会希望保留一些字符的原始位置,如回车符和换行符,因为这些字符在 Wiki 格式中有特殊的作用。

那么为什么不一直使用 CDATA 呢?因为它会增加文档的读取难度。而且如果它是不必要的,它会使文件变得很零乱。所以,对于那些您认为会包含特殊字符的数据,以及希望保留其格式时,要使用它,而且要鼓励编写 XML 格式的人使用它。但是不要滥用它。


要在可选的区域保留可选的数据

到现在为止,我们所讨论的 XML 文档都是具有严格的格式。我曾经建议使用验证器,如 XML Schema,这会实现一个严格格式的结构。这样的原因是:结构化的数据更容易解析。但是如果您需要增加一定的灵活性呢?我建议将可选的数据放到包含本身代码的可选区域中。例如,清单 5 就显示了这样的代码。

清单 5. 一个零乱的用户记录
<users>
    <user id="1">
        <first>jack</first>
        <middle>d</middle>
        <last>herrington</last>
        <runningpace>8:00</runningpace>
    </user>
</users>

它包含了用户的所有数据。其中的 first、middle 和 last 是很好理解的,但是 “runningpace” 是什么?它是必需的吗?您是否有很多这样的域?它是否可扩展?如果这些问题的答案都是肯定的,那么我建议使用 清单 6 所示的代码。

清单 6. 一个结构更好的用户记录
<users>
    <user id="1">
        <first>jack</first>
        <middle>d</middle>
        <last>herrington</last>
        <userdata>
        <field name="runningpace">8:00</field>
        </userdata>
    </user>
</users>

这样,您就能够拥有许多的域,但是它们不是分散到上级元素 <user> 的命名空间中。您甚至能够验证这个文档,也能够使用 XPath (//user/userdata/field[@name='runningpace') 引用某一个域。


结束语

我向您介绍了许多需要考虑的方面。五个不应该做的方面,五个我建议应该做的方面。它们并不是都能够应用到所有情况中,有时 XML 只是一个持久化格式,只是一次性传输格式,存在时间只有几毫秒而已。在这种情况下,您不需要考虑这里所介绍的问题。但是如果您使用 XML 作为一种文件格式,那么您就需要进行这些考虑,并且使用这里所介绍的最佳实践方法。

参考资料

学习

  • 语言律师可能会希望查看 W3C XML 规范:成为一个 “语言律师”,然后深入 XML 细节,它是一种简单且非常灵活的设计用于大型电子发布的文本格式,并且是 Web 及其他位置的一种重要的数据交换工具。
  • Document Type Definition (DTD) (Wikipedia):阅读更多关于 DTD 的信息,它是一组为 SGML 系列标记语言(SGML、XML、HTML)定义文档类型的标记声明。
  • XML Schema (Wikipedia):阅读一种规定文档类型结构和内容的 XML 的简要说明。
  • W3C XSLT 规范:了解一种能够将 XML 转换为不同格式的强大方法。
  • W3C XPath 规范:浏览一个极有价值的 XML 工具,您可以用它来快速且简单地在最复杂的 XML 文档中查找节点。
  • Actionscript 的 E4X 扩展(ECMAScript):进一步了解将 XML 直接整合到应用程序逻辑的一种极为灵活的方法。它非常简单,以致它几乎成为这种语言事实上的开放存储格式。(Wikipedia)
  • 本文作者的其他文章(Jack Herrington,developerWorks,2005 年 3 月至今):阅读关于 Ajax、JSON、PHP、XML 及其他技术的文章。
  • developerWorks XML 专区:在 XML 专区获取有助于提高您的专业技能所需的资源。
  • My developerWorks 中文社区:个性化您的 developerWorks 体验。
  • IBM XML 认证:了解如何才能成为一名 IBM 认证的 XML 和相关技术的开发人员。
  • XML 技术库:访问 developerWorks XML 专区,获得广泛的技术文章和技巧、教程、标准和 IBM 红皮书。同时阅读更多的 XML 技巧文章
  • developerWorks 技术活动网络广播:随时关注这些活动中的技术。
  • developerWorks 播客:收听面向软件开发人员的有趣访谈和讨论。
  • developerWorks 按需演示:观看面向初学者的产品安装和设置演示,以及为经验丰富的开发人员提供的高级功能。

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=XML
ArticleID=620211
ArticleTitle=关于 XML 应该做和不应该做的五个重要方面
publish-date=01302011