MicroXML 简介,第 1 部分: 探索 MicroXML 的基本准则

了解 XML 未来的可能走向

XML 社区中总有一部分人抱怨 XML 难以理解、难以处理。出于多种历史原因,XML 有着复杂的本质。十余年来,人们已经提出了多种简化版本。HTML5 威胁到了 XML 部分最基本的宗旨,引发了激烈的讨论。MicroXML 是这些讨论的成果之一。MicroXML 是一种向后兼容的简化版 XML,部分参与者的显赫身份和 MicroXML 出现的时机使之备受瞩目。John Cowan 已经在 Java™ 和其他相关工具中开发了 MicroXML 解析器。这篇文章介绍了 MicroXML 及其与 XML 1.x 和相关标准的技术差异。

Uche Ogbuji, 合作伙伴, Zepheira, LLC

Uche Ogbuji 是 Zepheira, LLC 的合伙人,这家公司专门提供下一代 Web 技术解决方案。Ogbuji 是 4Suite 的首席开发人员,这是一种用于 XML、RDF 和知识管理应用程序的开放源代码平台;也是 Versa RDF 查询语言的首席开发人员。他是一位出生在尼日利亚的计算机工程师和技术作家,目前定居在科罗拉多的博尔德。可以通过他的 Weblog Copia 进一步了解 Ogbuji 先生。



2012 年 7 月 09 日

简介

XML 是一种极为成功的技术,但它并非毫无缺陷。在伟大的成功之后,接踵而至的总是一些挑剔的审视,许多人都尝试从头开始重新设计 XML。人们利用 XPath、XSLT 和 XQuery 3.0 等最新 XML 处理规范解决 XML 命名空间的复杂性。某些极具影响力的核心 XML 专家也大胆地探讨了从头开始实现 XML 自身简化版的可能性。

造成这种情况的另一个因素是 HTML5 Web 浏览器开发人员带来的威胁。有时也称为 XHTML5 的一项技术从根本上颠覆了 XML,违背了 XML 生态系统最重视的部分准则。然而,大多数 HTML5 用户认为 XHTML5 的便捷性远不如 HTML5。

常用缩写

  • HTML:超文本标记语言
  • JSON:JavaScript Object Notation
  • PI:处理指令
  • XML:可扩展标记语言
  • XSLT:可扩展样式表语言转换

这样的力量组合引发了 XML-DEV 邮件列表和各种博客中的激烈争论。最终,James Clark 发布了 MicroXML 的完整提案。就职于 W3C XML Core 工作组的 John Cowan 成为这一规范的主要贡献者和编辑。

MicroXML 并不代表任何公认标准组织的官方立场,但出于多种原因,这种规范对于 XML 开发人员极有吸引力。John Cowan 开发了它的 Java 实现 MicroLark,我开发了一个 Python 实现。人们对于 MicroXML 规范兴致勃勃(请参阅 参考资料 部分)。请不要忘记,许多最重要的现代规范(例如 JSON 和 Markdown)都有着类似的非官方出身。

了解 MicroXML 最有价值的一个方面就是,它能够帮助您了解实现纯 XML 的最有效方法。在本文中,您将了解 MicroXML。文中的示例将探讨 MicroXML 与纯 XML 之间的关键差别。此外还会阐述基本原理。本文假设您熟悉 XML 的基本知识。

MicroXML 准则

MicroXML 的两个关键目标是:

  • 维护非常简单的数据模型
  • 维护与 XML 的向后兼容性

所有其他方面均源自这两个目标。MicroXML 文档就是格式良好的 XML 文档。MicroXML 也设计为对 HTML5 和 JSON 保持友好兼容。

Infoset 和 XPath 数据模型 (XDM) 等 XML 数据模型的规范均长达数十页。即便是因优雅和轻量而备受赞誉的 XPath 1.0 数据模型的规范也有数页之多。如果不考虑 JSON 兼容性备注,MicroXML 数据模型的规范只有半页。John Cowan 甚至将其全部内容精简为下面这一段话。

“一个文档的数据模型至少包含一个元素对象。元素对象就是文档中单独一个元素的抽象描述。每个元素对象都有三个相关属性:名称、属性映射和子对象序列。名称是一个字符串,属性映射将名称字符串映射到值字符串,序列中的每个子对象均为表示字符数据的字符串或元素对象。”

本文后续内容将重点讨论 MicroXML 语法(该语法直接源自数据模型)。MicroXML 中的封装概念就是文档,是解析完全符合 MicroXML 规范的输入流的结果。

良好格式

XML 与 MicroXML 之间最根本的差异在于解析器行为的处理方式。XML 的错误处理因吹毛求疵而声名狼藉,使用 XML 错误处理时,解析器必须在第一个错误发生时立即中止。这种方式存在极大的争议,尤其是考虑到 HTML 已经使人们习惯了粗略的标记。XML 批评者还引用了伯斯塔尔法则:保守发送,开放接收。

在 MicroXML 中,即便发生了错误,解析器也能继续运行。但在发生错误的点上,必须将输入标记为未归档,从而允许符合规范的 MicroXML 解析器切换到不同的输入解释。只需思考一下 HTML 解析器如何从符合标准的模式切换到 “tag soup” 模式,您就能了解这种概念。

例如,假设一个 XML 处理器遇到以下输入,则必须在到达 </para> 时立即停止,这会引发有关不匹配的结束标记的非良好格式错误。

 <para>Hello, I claim to be <strong>MicroXML</para>

在同样的情况下,MicroXML 解析器可继续操作,但不会再将输入报告为 MicroXML 文档。它甚至能够修复输出,在 </para> 之前插入一个 </strong>,但同样不能声明结果属于 MicroXML 文档。如果您正在设计必须处理无法预测的输入的实际系统,这种格式良构性限制的细微缓和会造成极大的差异。


MicroXML 剖析

MicroXML 仅支持一种编码:UTF-8。MicroXML 文档是一个使用 UTF-8 编码的字符序列,构成了用 MicroXML 数据模型表示的结构。与 XML 一样,字符的原始序列称为文本,其中包含标记和字符数据。下例展示了文本与字符数据之间的技术差异。

 <para style="friendly">Hello, I am...<strong>MicroXML</strong></para>

不但 <para> 标记与 </para> 标记之间的全部内容均为文本,而且仅有以下序列是字符数据:

  • friendly
  • Hello, I am...
  • MicroXML

字符数据是出现在属性值之中并位于构成元素的标记之间的内容。

元素、属性和字符数据

元素、属性和字符数据是 XML 的基础,MicroXML 对这些结构改动不大。最大的差异在于元素名称中隐藏的冒号。这防止了元素使用前缀,常常在应用 XML 命名空间规范时使用前缀。稍后我们会提到,MicroXML 确实支持命名空间,但所有元素都必须使用无前缀的形式。

属性可使用有前缀的命名空间形式,这些属性有时也称为全局 属性。MicroXML 规范定义了以下用法:

  • xml:space
  • xml:lang
  • xml:base
  • xml:id

XML 1.0 允许使用 spam:eggs:toast 这样的属性名称,但 XML 命名空间和 MicroXML 禁止使用这些形式。MicroXML 与 XML 中也采用相同的无前缀属性规则;无前缀的属性不属于任何命名空间,即便它出现在一个位于某命名空间之内的元素之中。

与 XML 不同,MicroXML 没有对属性中的空格加以规范。在 XML 中,以下两个文档是无法区别的。

<para>Hi. I'm some form of <abbr ref="Extensible Markup Language">XML</abbr></para>

<para>Hi. I'm some form of <abbr ref=" Extensible   Markup   Language ">XML</abbr></para>

请注意 ref 属性中空格的差别。MicroXML 在遇到属性中的空格时会准确报告空格的存在,因此可以确定这两个文档是不同的。

处理指令和注释

处理指令 (PI) 一直是 XML 中备受争议的一个方面,MicroXML 沿用了与 XML 相同的 PI。部分用户希望包含 PI,其他一些用户则希望删除 PI。PI 在 HTML5 中的未来走向也并不明确。MicroXML 实现了良好的均衡,它允许使用与起始标记极其相似的一组有限的 PI。最常用的 PI 是 xml-stylesheet,它仍然是正确的 MicroXML。

 <?xml-stylesheet type="text/css" href="mystyles.css"?>

MicroXML 注释与 XML 注释极为相似。为了适应 HTML5,添加了一些限制,但对绝大多数开发人员无任何影响。出于兼容性方面的原因,MicroXML 并未放松 XML 中的某些限制,尤其是注释中的双横线 (--) 以及嵌套注释。

注释的目的仅仅是为阅读文档的用户提供便利,解析器将忽略注释。MicroXML 解析器会报告 PI,但不会将其视为数据模型的一部分。识别和使用 MicroXML PI 的应用程序必须在语法层工作,而非在数据层。

命名空间

MicroXML 支持简化的 XML 命名空间方法。解析器将命名空间声明属性(xmlnsxmlns:a-prefix)作为常规属性展示给应用程序,不做任何特殊处理。当然,我们鼓励 MicroXML 应用程序利用这些信息构建元素和属性具有独立于前缀的通用名称的模型。

总体而言,MicroXML 支持 XLink 等规范,包括 SVG 这样的相关规范。

其他概念

MicroXML 包含有关以下内容的简要部分:

  • 类似于 XML 1.0 的人类语言规范 (xml:lang) 和空格预留 (xml:space)。
  • 类似于对应 Core XML 规范的 xml:basexml:id

惟一受支持的文档类型声明就是声明根元素名称的简单文档类型声明。MicroXML 的内部子集和外部子集均完全不支持文档类型定义 (DTD)。


MicroXML 示例

这一节给出了一个非常完整的、真实的典型 XML 示例,展示了它在 MicroXML 中的对应形式。Atom 往往包含多个命名空间的组合,因此是一种出色的示例格式。清单 1 基于教程 “使用 XSLT 处理 Atom 1.0 with XSLT”(请参阅 参考资料 部分)中的清单。为了演示 MicroXML 中的命名空间变化,我删除了一个 entry 元素,为所有核心 Atom 元素(例如 feed)增加了一个命名空间前缀 a

清单 1. 典型的 XML
<?xml version="1.0" encoding="utf-8"?>
<a:feed xmlns:a="http://www.w3.org/2005/Atom" xmlns="http://www.w3.org/1999/xhtml"
      xml:lang="en"
      xml:base="http://copia.ogbuji.net">
  <a:id>http://copia.ogbuji.net/atom1.0</a:id>
  <a:title>Copia</a:title>
  <a:updated>2005-07-15T12:00:00Z</a:updated>
  <a:author>
    <a:name>Uche Ogbuji</a:name>
    <a:uri>http://uche.ogbuji.net</a:uri>
  </a:author>
  <a:link href="/blog" />
  <a:link rel="self" href="/blog/atom1.0" />
  <a:entry>
    <a:id>http://copia.ogbuji.net/blog/2005-09-16/xhtml</a:id>
    <a:title>XHTML tutorial pubbed</a:title>
    <a:link href="http://copia.posterous.com/xhtml-tutorial-pubbed"/>
    <a:category term="xml"/>
    <a:category term="css"/>
    <a:category term="xhtml"/>
    <a:updated>2005-07-15T12:00:00Z</a:updated>
    <a:content type="xhtml">
      <div>
        <p>
          <a href="http://www.ibm.com/developerworks/edu/x-dw-x-xhtml-i.htm">
            "XHTML, step-by-step"
          </a>
        </p>
        <blockquote>
          <p>Start working with Extensible Hypertext Markup Language. In this tutorial,
          author Uche Ogbuji shows you how to use XHTML in practical Web sites.</p>
        </blockquote>
        <p>In this tutorial</p>
        <ul>
          <li>Tutorial introduction</li>
          <li>Anatomy of an XHTML Web page</li>
          <li>Understand the ground rules</li>
          <li>Replace common HTML idioms</li>
          <li>Some practical considerations</li>
          <li>Wrap up</li>
        </ul>
      </div>
    </a:content>
  </a:entry>
</a:feed>

清单 2清单 1 的 MicroXML 版本。请注意,这里没有出现 XML 声明,MicroXML 中并未提供相关支持,也不必提供相关支持,因为它仅仅支持 UTF-8 编码。任何元素都不带前缀。feed 元素的默认命名空间设置为 Atom,div 元素的默认命名空间设置为 XHTML。

清单 2. MicroXML 版本
<feed xmlns="http://www.w3.org/2005/Atom"
      xml:lang="en"
      xml:base="http://copia.ogbuji.net">
  <id>http://copia.ogbuji.net/atom1.0</id>
  <title>Copia</title>
  <updated>2005-07-15T12:00:00Z</updated>
  <author>
    <name>Uche Ogbuji</name>
    <uri>http://uche.ogbuji.net</uri>
  </author>
  <link href="/blog" />
  <link rel="self" href="/blog/atom1.0" />
  <entry>
    <id>http://copia.ogbuji.net/blog/2005-09-16/xhtml</id>
    <title>XHTML tutorial pubbed</title>
    <link href="http://copia.posterous.com/xhtml-tutorial-pubbed"/>
    <category term="xml"/>
    <category term="css"/>
    <category term="xhtml"/>
    <updated>2005-07-15T12:00:00Z</updated>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.ibm.com/developerworks/edu/x-dw-x-xhtml-i.htm">
            "XHTML, step-by-step"
          </a>
        </p>
        <blockquote>
          <p>Start working with Extensible Hypertext Markup Language. In this tutorial,
          author Uche Ogbuji shows you how to use XHTML in practical Web sites.</p>
        </blockquote>
        <p>In this tutorial</p>
        <ul>
          <li>Tutorial introduction</li>
          <li>Anatomy of an XHTML Web page</li>
          <li>Understand the ground rules</li>
          <li>Replace common HTML idioms</li>
          <li>Some practical considerations</li>
          <li>Wrap up</li>
        </ul>
      </div>
    </content>
  </entry>
</feed>

清单 3 展示了同时属于有效 HTML5 文档的一个 MicroXML 文档。这里使用了简化的 Doctype 声明。这个示例还使用了一条处理指令和一条注释。

清单 3. MicroXML 及有效的 HTML5
<!DOCTYPE html>
<?xml-stylesheet type="text/css" href="mystyle.css"?>
<html lang="en">
  <!-- A comment -->
  <head>
    <title>Welcome page</title>
  </head>
  <body>
    <p>Welcome to <a href="ibm.com/developerworks/">IBM developerWorks</a>.</p>
  </body>
</html>

结束语

MicroXML 仍然是一种崭露头角的规范。我并不是建议您一定要完全接受它,或者完全背离 XML,但这确实是一项重要的开发。了解 MicroXML 能帮助您很好地认识到,在当前的形势变化下(例如 JSON 和 HTML5 的兴起),如何最有效地利用 XML。MicroXML 规范短小精悍,并且还有一些工具即将面世。建议您尝试了解 MicroXML。

参考资料

学习

获得产品和技术

讨论

条评论

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, Open source, Web development
ArticleID=824618
ArticleTitle=MicroXML 简介,第 1 部分: 探索 MicroXML 的基本准则
publish-date=07092012