内容


了解有用的 XML 结构:使用 XML 格式的地址记录

信息分析简述

Comments

XML 在信息处理中已经变得无处不在,渗透到从传统发布到业务事务再到 Twitter 的所有事物中。“XML 很简单!” 这种认识往往意味着,面向 XML 应用程序的标记组设计往往没有面向信息集合的标记组设计那么理想。低劣的信息设计可能会使信息集合的操作和呈现所需的代码更复杂。幸运的是,在最开始多做一些工作能够简化以后的开发工作。

设计一个信息结构可以归结为三个基本问题:

  • 一个信息集合的有用 片段是什么?
  • 这些片段之间的关系如何?
  • 关于这些片段还有其他需要了解的吗?

我们来检查一个常见信息集合,并考虑数据处理中可能用到的 XML 结构。

检查一条地址记录

一条地址记录可能以多种不同形式、在多个不同环境中出现:可能在另一条信息集合中单独出现,也可能作为存储在数据库中的集合的成员,以标签形式查询或打印。一条典型的地址记录可能如 清单 1 所示。

清单 1. 一条姓名和地址记录
John Q. Public
1234 Main Street
Anytown, Anystate 54321-6789

从 XML 角度看,这条记录的结构可以非常简单,如 清单 2 所示。

清单 2. 使用简单标记的姓名和地址记录
<address_rec>
  <line>John Q. Public</line>
  <line>1234 Main Street</line>
  <line>Anytown, Anystate 54321-6789</line>
</address_rec>

也可以很复杂,如 清单 3 所示。

清单 3. 使用复杂标记的姓名和地址记录
<address_rec>
  <name>
    <given_name>John</given_name>
    <middle>Q.</middle>
    <family_name>Public</family_name>
  </name>
  <address>
    <street>1234 Main Street</street>
    <city>Anytown</city>
    <state>Anystate</state>
    <zip_code>54321-6789</zip_code>
  </address>
</address_rec>

您可以进一步细化这个结构,标记标点(句点、逗号和短横线)或将邮政编码分为两部分。您还可以添加信息,比如电话号码、传真号、电子邮件地址或网址。

确定一条地址记录的要求

现在停下来回想一下此前提出的基本问题。什么是有用 片段?要确定有用片段,首先需要确定数据的要求和目的。您将:

  • 打印标签?
  • 根据姓氏或邮政编码排序?
  • 搜索姓名、城市或州?

当您把数据分割为有用片段时,如何使用数据将影响您的选择。因此,分析一个信息集合的第一步将是识别关键要求。定义一组容器(或根据现有标准选择一个容器组)应该由信息集合的特定使用需求驱动。将一个表分解为一些行和列也许还不够 — 一个关系表的记录结构也许不能捕获一些有用的组合。

一个信息集合的要求通常可以划分为三个类别:

  • 必须拥有。如果这些要求没有得到满足,项目将会失败。
  • 最好拥有。如果这些要求能够满足,您就能够向用户提供更多价值。
  • 如果资源不受限(“Blue Sky” 选项)。这些是超出当前项目范围的 “很酷” 的特性。

根据目前的预算和最后期限,“必须拥有” 的要求是预先确定的;一个项目也可以选择一些 “最好拥有” 的要求。也就是说,最好记录所有已识别的要求 — 甚至是 Blue Sky 要求。某个小组认为是 Blue Sky 的要求可能是一个 “必须拥有” 的要求的副产品。

定义并改进地址记录模型

一个 XML 结构通常由元素和属性组成 — 在最基本的层面上,元素 是数据容器,属性 是数据容器的标签。当您首次为一个信息集合构造一个 XML 模型时,通常应将这个信息集合定义为一个元素集合并使用属性来改进这个元素结构。

在这个地址记录示例中,简单结构和复杂结构都只使用元素来表达;可以使用属性来改进和增强这个结构 — 例如,通过排序键。如果您开发自己的词汇表而不是采用一个标准词汇表,那么 XML 结构以及属性和元素的选择完全由您决定。能否使用一些元素或属性来标识有用信息片段受到少数几个技术约束的限制,除此之外,您可以完全灵活地选择。

检查一下来自 清单 3 的更复杂的示例,这个复杂示例似乎满足了目前确定的所有要求:

  • 可以打印。事实上,每条记录可以打印为三行:一行打印 name 元素,一行打印地址的 street 元素,另外一行打印地址的 city、state 和 zip code 元素。
  • 您已经标识了 surname 和 zip code,因此您可以使用这些元素的内容来对 address_rec 元素排序。
  • 您已经标识了姓名及其组成,以及城市和州,因此,您可以搜索字符串并将结果限制到这些元素。

看起来您已经满足了所有初始要求。尽管可以进一步增强这个结构,但现在可以认为工作已经告一段落。记住这条古老的谚语:能够做并不意味着应该做。

您会如何增强这个结构呢?数据库喜欢使用键,因此,添加一个记录键到每个 address_rec 组件,如 清单 4 所示。

清单 4. 带有一个 key 属性的姓名和地址记录
<address_rec key="1234">
  <name>
    <given_name>John</given_name>
    <middle>Q.</middle>
    <family_name>Public</family_name>
  </name>
  <address>
    <street>1234 Main Street</street>
    <city>Anytown</city>
    <state>Anystate</state>
    <zip_code>54321-6789</zip_code>
  </address>
</address_rec>

如果您从一个数据库提取一些记录来创建 XML 文档,您可以将数据库键直接传输到 address_rec 元素的 key 属性。key 属性的作用是充当 address_rec 容器上的一个标签,为记录提供一个惟一的标识符。

尽管您可能不想打印虚构标签上的电话号码,但您可以捕获其他类型的联系信息,将其传输到您的 address_rec XML 文档。您可以在 XML 结构中包含电话号码和其他形式的电子联系信息,如 清单 5 所示。

清单 5. 带有其他联系信息的姓名和地址记录
<address_rec key="1234">
  <name>
    <given_name>John</given_name>
    <middle>Q.</middle>
    <family_name>Public</family_name>
  </name>
  <address>
    <street>1234 Main Street</street>
    <city>Anytown</city>
    <state>Anystate</state>
    <zip_code>54321-6789</zip_code>
  </address>
  <phone>316-555-1234</phone>
  <email>john@mydomain.com</email>
  <web>http://www.mydomain.com/john</web>
</address_rec>

如果您的这位神秘的 John Q. Public 在计算机上花费的时间和我一样多,他也许拥有几个联系点。您可以为每个联系点创建一个元素,也可以使用带有一个修饰属性的单个重复元素来标识他的每个地址。我们将尝试使用后者。您还可以允许使用多个电话号码,如 清单 6 所示。

清单 6. 带有更多联系信息的姓名和地址记录
<address_rec key="1234">
  <name>
    <given_name>John</given_name>
    <middle>Q.</middle>
    <family_name>Public</family_name>
  </name>
  <address>
    <street>1234 Main Street</street>
    <city>Anytown</city>
    <state>Anystate</state>
    <zip_code>54321-6789</zip_code>
  </address>
  <phone type="home">316-555-1234</phone>
  <phone type="fax">316-555-1235</phone>
  <phone type="mobile">316-555-1236</phone>
  <web type="email">john@mydomain.com</web>
  <web type="email">john@myworkdomain.com</web>
  <web type="homepage">http://www.mydomain.com/john</web>
  <web type="twitter">johnqpublic</web>
</address_rec>

元素和属性的选择是任意的(除非您需要适应其他人的结构),type 属性的值也是任意的。姓名和值的选择也可以通过应用程序或系统的需求驱动。

这个过程最重要的部分是满足要求:如果您能够完成预定的任务,那么您就出色地完成了工作。

模式和验证:要求还是增强?

当您确定一个信息集合的有用片段并定义和改进模型后,下一个问题是:工作完成了吗?对于某些 XML 应用程序,标识有用信息块并使用那些添加了标签的信息片段来驱动所需的任何后续流程就足够了。

至此,您已经创建了 “格式良好的” XML 文档:这些文档遵循非常少的规则,适用多种不同的处理系统。对于许多应用程序而言,格式良好的 XML 文档就可能够用了。

但是,如果您的某些要求需要满足一组更严格的规则,那又该怎么办呢?XML 文档可以被验证 — 即由一个程序针对一组更特定的规则和关系进行检查 — 您可以使用一种或多种正式验证语言来编写一个验证框架。常用验证语言有:

  • Document Type Definition (DTD)。继承自 SGML (ISO 8879, "Standard Generalized Markup Language"),DTDs 是最古老的验证语言,定义为 W3C 的 XML Recommendation 的一部分。
  • W3C XML Schema。这种语言由 W3C 开发并被广泛实现,包含数据类型化(datatype)并被编写为一个 XML 文档。
  • RELAX NG。这种语言最初由 Organization for Advancement of Structured Information Standards (OASIS) 开发,之后被定义为一个 ISO 标准 — ISO/IEC 19757-2:2008 — 的一部分,它拥有两种形式:XML 文档形式和一个紧凑的、非 XML 形式。

可以用 Schematron 表达这些模式语言没有包含的其他规则,Schematron 是一种基于 XSLT 的验证语言,用于验证文档内容和结构。

模式也可以是一种用于交流理想结构和关系的有用方法 — 特别适用于表单和创作工具等人类交互。它表示信息提供者和信息使用者之间的契约 — “这是我想得到的,这是我期望的组织方式。”

验证不是一个基于 XML 的应用程序的必要部分,但通常是控制 XML 文档的创建或对来自其他源的 XML 文档提供质量控制的有用工具。

您需要一个模式吗?创建一个模式需要知识、时间和努力:如果它不属于您正在开发的应用程序或系统的一个有用部分,创建一个模式也许是浪费资源。考虑以下原则:

  • 您的信息是机器生成的还是人工生成的?模式是交流信息集的结构和内容需求的有用方法 — 对创作工具尤其如此。
  • 包含的信息来自您无法控制的源吗?如果是这样,那么模式可以确认外部信息源提供的 XML 文档是否遵守您期望接收的结构。
  • 您需要验证吗?您的系统或客户机可能需要将验证作为系统的一部分,正式验证需要不同形式的模式。
  • 您的处理链中的工具需要模式吗?用于操作或呈现 XML 文档的工具可能不需要模式,但创作工具也许需要。

记住,那条古老的谚语在这里也适用:能够做 并不意味着应该做。有时,为一个特殊信息集合开发模式可能没有必要而且没什么用,或者因为工作量巨大而变得不可能。有用的模式适合于其中的数据相对可预测的应用程序 — 数据集合中的变化越多,需要的模式就越复杂。

结束语:信息分析简述

您现在应该已经清楚了解了确定一个 XML 信息集合的有用部分的流程:

  1. 定义信息集合的要求。
  2. 检查信息集合样例。
  3. 识别满足要求的信息集合片段和片段之间的关系。

为 XML 应用程序构建坚实的基础能够减少您在开发过程中编写真正聪明(即复杂)的代码的需求。


相关主题

  • XML Recommendation(包括 DTDs):在这个 W3C 标准文档中发现关于 XML 和 DTDs 的更多细节。
  • W3C XML Schema Recommendation Part 0—the primer:阅读这个介绍 W3C XML Schema 语言的标准文档。
  • RELAX NG 信息站点:找到关于 ISO/IEC 19757-2:2008 的链接和信息。
  • OASIS:了解关于这个开放标准组织的更多信息。
  • XML 新手入门基础知识(Kay Whatley,developerWorks,2009 年 2 月):您是 XML 新手?当您学习创建格式良好的 XML 时,获取关于 XML 文档构造的基础知识,包括命名惯例、正确的标记嵌套、属性指南、声明、实体以及 DTD 和模式的验证。
  • RELAX NG(developerWorks,2007 年 4 月):介绍一个 XML 词汇表的语法规则。
  • 关注 developerWorks 上 David Mertz 的 XML Matters 专栏中的 “Kicking back with RELAX NG” 系列:
    • 第 1 部分(2003 年 2 月):检查 RELAX NG 的基本语义和数据输入基础。
    • 第 2 部分(2003 年 3 月):继续第 1 部分的讨论,解决其他几个语义问题,检查几个使用 RELAX NG 的工具。
    • 第 3 部分(2003 年 5 月):详细探索 RELAX NG 的紧凑语法,解释紧凑语法和 XML 语法之间的确切对应关系。
  • Schematron(developerWorks,2007 年 4 月):发现单独(或与其他模式语言联合)使用 Schematron 标准定义和限制 XML 词汇表的好处。
  • XML Schema 1.1 系列: XML Schema 1.1 简介(Neil Delima、Sandy Gao、Michael Glavassevich、Khaled Noaman):在这个 developerWorks 系列中了解这个新兴标准的最新特性:
  • developerWorks 技术活动网络广播:随时关注这些技术的最新进展。
  • 下载 IBM 产品评估试用版软件IBM SOA Sandbox for People,并开始使用来自 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的应用程序开发工具和中间件产品。

评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=XML
ArticleID=474473
ArticleTitle=了解有用的 XML 结构:使用 XML 格式的地址记录
publish-date=03152010