跳转到主要内容

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

当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

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

  • 关闭 [x]

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

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

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

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

  • 关闭 [x]

XML 观察: 探索 XML 的替代语法

权衡利弊

Edd Dumbill (edd@xml.com), 编辑兼发行人, xmlhack.com
Edd Dumbill 是 XML.com的执行编辑,XML 开发人员新闻网站 XMLhack的编辑兼发行人。他还是 O'Reilly 出版的 Programming Web Services with XML-RPC一书的作者之一, Pharmalicensing生命科学知识产权交换的奠基人之一和顾问。 Edd 也是 XML Europe大会的执行主席。可以通过 edd@xml.com与他联系。

简介: 名字算什么呢?玫瑰既使换了名字,也依然芳香 —— 莎士比亚,罗密欧与朱丽叶

发布日期: 2003 年 12 月 01 日
级别: 中级
访问情况 : 1459 次浏览
评论: 


有关 XML 的一个悖论是,尽管它从文档创建团体继承了不少传统,但却常常令手工代码编写者感到非常沮丧。起始和结束标签以及转义特殊字符都需要额外录入,不仅浪费时间还会造成更多的错误。如果您不想购买编辑器来避开这些问题——许多人由于各种不同的理由不愿这样做,比如习惯、原则以及创建通用 XML 编辑器的极端困难——您就只能使用一般的编辑方式。

SGML,XML 面向文档的前辈,提供了避免这类问题的一种方法。SGML 包括增加快捷方式减少所需标签数量的方法,甚至能够完全重定义文档语法。但是在创建 XML 时,为了简化语言增强互操作性而省略了这种功能。

尽管随着时间的推移,SGML 的许多特性已经为 XML 重新实现了——无论是标准化组织的制定,还是仅仅由社区推动的努力。具有讽刺意味的是,在 XML 的早期,其拥护者兴高采烈地宣称 XML 优于 SGML 的简单性。现在随着 XML 的完善,这两种技术的复杂性至少是相当的!

本文的目的是考察一些开发 XML 的最流行替代语法,强调它们的适用范围。我不准备把它们全列出来,许多人在这方面已经做了大量的工作。替代语法出于各种不同的动机而创建:为了简化操作、模仿偏爱的环境、更好地表明底层数据模型或者为了更好地利用现有的工具。(关于这些语法显著降低互操作性的质疑,答案是这些语法都没有声称是交换语法,这一点仍然保留给 XML 1.0 语法。)

易于使用

我要考察的前两种语法是在 节省工作量方面最主要的竞争者:PYX 和 SOX。

PYX是一个面向行的 XML 替代语法。今年早些时间,在 developerWorks上,David Mertz 曾经详细地讨论过它(请参阅 参考资料)。与本文中讨论的其他语法不同,PYX 主要适用于作为输出的替代语法。您将看到,使用 PYX 编辑 XML 看起来是非常不现实的。Sean McGrath 创建的 PYX 基于一个 SGML(真是奇怪!)概念,称为 Element Structure Information Set(元素结构信息集)或者简称为 ESIS。 PYX 使用每一行的第一个字符代表一个标记 事件,比如起始标签或者属性。 表 1展示了一个基本的 XHTML 页在 PYX 中是什么样子。


表 1. PYX 与 XML 的比较

PYX 版

XML 版

(html
Axmlns http://www.w3.org/1999/xhtml
-\n
(head
(title
-Test page
)title
)head
-\n
(body
-\n
)body
-\n
)html
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>Test page</title></head>
<body>
</body>
</html>

PYX 主要的好处在于能够利用大量的面向行的工具,特别是在过去 20 年中,在类 UNIX 操作系统下发展起来的那些工具。您可以使用像 grepwc 这样熟悉的工具,而不必使用 SAX 或者 DOM 重新编写处理文档的工具。比如,要计算文档中段落数,可以使用以下命令:

grep '^(p' document.pyx | wc -l

与本文中所讨论的所有语法一样,PYX 的缔造者也发布了一个在 PYX 和 XML 之间进行转换的工具。关于转换工具的更多信息,请参阅 参考资料

SOX,或者 Simple Outline XML(简单大纲 XML)采用了另外一种常见的文本格式模式——大纲。大纲是对文档中树型结构的通称。这样的层次可以通过特殊的字符序列或者缩进来表示。SOX 使用缩进来表示 XML 元素的嵌套层次。通过这种方法,它可以省略元素的结束标签。 清单 1给出了 表 1中例子的 SOX 形式。


清单 1. 用 SOX 表示的简单 XHTML 文档
		
html>
    xmlns http://www.w3.org/1999/xhtml
    head>
        title> Test page
    body>

SOX 的新用户不会发现它是一个完全不同于 XML 1.0 的步骤,特别是与 PYX 比较。SOX 的主要优点是在使用简单的文本编辑器编写文档时更容易保证文档具有良好的格式。此外,每行上仅限于一个元素也意味着仍然能够使用面向行的处理方式,也就是说编写晦涩难懂的文档更难了。

但是,因为 SOX 是为编辑而设计的,而且由于它保留了大于号(>)这个特殊字符,还有一些更精致的规则处理空白字符、转义字符,等等。完整的细节,请参阅 参考资料 中给出的 SOX 页面。由于这些微妙之处,与使用正规的开发人员文本编辑器的 XML编辑模式相比,如 emacs 或者 vim ,很难看出 SOX 表示有什么优越之处,您仍然需要通过 SOX-to-XML 转换器运行 SOX 文档,以检查它的正确性。


模仿程序语言

在把 XML 投射到所喜欢的程序语言语法方面也进行了一些尝试。这种方法的好处包括:

  • 编辑时不需要在可选的语法之间切换。
  • 可以利用现有的编辑辅助工具。
  • 能够直接在语言编译器或者解释器中解释 XML 文件。

Python -- SLiP

Python 编程语言的语法常常存在两种极端的观点:它依靠行的缩进级别表示块,而不是其他语言所使用的大括号 {} 或者小括号 ()。它确实能够产生风格优雅、整齐美观的代码。

SLiP(全称“Sorta Like Python”)的 XML 语法,由 Scott Sweeney (请参阅 参考资料)提出,使用了类似 Python 的缩进规则,可以被任何 Python 感知编辑器格式化。Sweeney 这样描述他的动机:“我最近参加一个会议时冒出了这个想法。我需要能够在我的笔记本电脑上有一种快速记录的方法……到目前为止我所见到的差不多所有 XML 编辑器都是面向鼠标的,需要不断地在鼠标和键盘之间来回切换,根本不能专心听讲。我需要一种更快的方法。”

清单 2用一个 XHTML 小文档说明了 SLiP 的语法。


清单 2. 用 SLiP 表示的简单 XHTML 文档
		
html(xmlns="http://www.w3.org/1999/xhtml"):
    head():
        title(): "Test page"
        body():

Scheme -- SXML

尽管本文中所考察的大多数语法都试图引入某种程度的简化,SXML 采用了一种不同的方法,强调与 Scheme 的兼容性而不是简洁。它提供了 XML 文档在 Scheme 编程语言中的一种表示,一旦这种表示成功的话,对文档的操作就成为 Scheme 数据结构本身的操作。

清单 3说明了 SXML 中的示例 XHTML 文档。使用 S 表达式来编码 XML 还有一个有趣的历史渊源:在 XML 突然从 W3C 崛起之前,S 表达式正是 W3C 推荐语言所钟爱的一种语法,例如,在 参考资料中,可以看到 W3C 的 Platform for Internet Content Selection (PICS)内容分级建议。


清单 3. 用 SXML 表示的简单 XHTML 文档
		
(html (@ (xmlns "http://www.w3.org/1999/xhtml"))
  (head
    (title "Test page"))
  (body))

SXML 的缔造者 Oleg Kiselyov 曾经超越了单纯的语法,把 SXML 开发成一种非常有用的工具,包括 XPath 和 XSLT 实现。Oleg 的 XML and Scheme 主页(请参阅 参考资料)包含了许多融合 XML 和 Scheme 的有趣想法,包括关于让 XML 文档能够执行的想法的讨论。


专用领域的语法

也许最有用的一类非 XML 语法是专用领域的语法。任何通用的 XML 替代语法仍然在尝试冲破通用性的限制:只有少量的通用语义概念,因此限制了把它们压缩成简洁语法的机会。相反,当考虑 XML 应用程序时,把多标签结构压缩成较短的表示则有很大的适合范围。本节讨论了这类语法中最有用的一些。

面向文档标记的 WikiML

在 HTML 之后,在 Web 上最流行的标记语言可能是 WikiWikiWeb 中使用的语言,一种容易上手的超文本文档系统,使用 Web 浏览器作为自己的用户界面。Wikis 倾向于使用简单的基于字符的标记表示结构,平衡了灵活性和便捷性。例如,比较下面用 Wiki 标记的 HTML 超文本链接:

<p>Here's a link to <a href="http://www.ibm.com">IBM</a>.</p>
Here's a link to [IBM|http://www.ibm.com].

不幸的是,Wiki 语法往往因不同的 WiKi 系统而异。WikiML 工具采用流行的 PHPWiki 项目所使用的语法,并将其转换成 XML 语言,即WikiML。通过应用不同的样式表,可以把它转换成 XHTML 或者 DocBook。Wikis 对于特定的文档编制任务非常方便,您将会顽固地坚持用原始的 XML 有效地编写代码。

压缩 XSLT -- XSLTXT

XSLT 无疑是流传最广的被严重曲解的编程语言之一。XML 语法对于样式表的编制者没有多少帮助,简单的结构(比如“switch/case”块)会很快增长到令人吃惊的长度。

XSLTXT 是试图摆脱 XSLT 标签泥潭的一个项目。XSLTXT 根本没有尝试改变 XSLT 语义,而是提供了一个减少混乱的语法。 表 2通过一个典型的块对 XSLT 和 XSLTXT 进行了比较。


表 2. XSLT 与 XSLTXT 代码的比较

XSLT 代码

XSLTXT 等价代码

<xsl:template name="foo">
  <xsl:param name="a"/>
  <xsl:param name="b"/>
  SELECT <xsl:value-of select="$a"> FROM <xsl:value-of select="$b"/>
</xsl:template>

tpl .name "foo" ("a", "b")
  "SELECT " 
  val "$a"
  " FROM "
  val "$b"

XSLTXT 与 SLiP 类似,使用缩进表示块结构,使用缩写形式表示 xsl:template 之类的关键字。此外,使用括号表示参数。XSLTXT 项目提供了 XSLT 和 XML 转换器,还提供了一个 TXTReader Java 类,在 XML 处理程序中可用作 XSLT 的一个插入式解串器。


RELAX NG Compact

RELAX NG (RNG) 是一种 XML 模式语言,由一个 OASIS Technical Committee 开发。RNG 幕后的主要鼓动者是 James Clark,他也是 XSLT 的策划者。(人们可能会怀疑是否是 XSLT 经验推动了 RELAX NG Compact 语法。)RNG 的缔造者认识到当人们在考虑对一个模式进行建模时,并不真正愿意花费时间考虑那些过多的尖括号。于是他们创建了 RELAX NG Compact,这是一个非 XML 语法,但它为 RELAX NG 实现了与 XML 语法相同的概念。 表 3展示了紧凑语法如何帮助改善 XML 语法的清晰性。


表 3. RELAX NG Compact 与 XML 语法的比较

RELAX NG 版本

RELAX NG Compact 版本

<?xml version="1.0" encoding="UTF-8"?>
<element name="date"
xmlns="http://relaxng.org/ns/structure/1.0">
 <optional>
  <attribute name="type"/>
 </optional>
 <element name="year"><text/></element>
 <element name="month"><text/></element>
 <element name="day"><text/></element>
</element>

element date { 
  attribute type { text }?,
  element year { text },
  element month { text }, 
  element day { text }
}

紧凑语法同时减少了文本的数量,使元素之间的关系更加清晰。它比 XSLTXT 更进一步:除了减少需要输入的工作量之外,要注意,RELAX NG Compact 实际上是一种不同的语言——比如问号的使用( ? )代替了 <optional> 元素容器。因为紧凑语法实际上是由负责原始语言的同一个小组开发的,采用率和支持率都很高。相反,本文中提及的大量语法往往是由某个第三方组织提出的。

还有其他带有复杂结构的 XML 语言,这些结构都提议了非 XML 语法,主要包括:Topic Maps,Lars Marius Garshol 为它提议了线性主题映射符号(Linear Topic Map Notation);RDF,Dan Connolly 和 Tim Berners-Lee 为它提议了 N3,这实际上是一个 RDF 超集(请参阅 参考资料)。


结束语

创建非 XML 语法的主要动机在于解决编辑 XML 过程碰到的固有困难。如 Scott Sweeney 所讲的那样,即使最商业化的 XML 编辑器也在一定程度上需要 定位和点击,这成为快捷自由地编写内容的拦路虎。回顾一下,经过压缩的通用 XML 语法(比如 SOX 和 SLiP)之间只有很小的差别:他们的主要好处看起来就是省略结束标签的能力。

这种压缩语法的不足是丧失了互操作性和能否经得住时间的考验。多数成果都来自于单独的第三方。还不完全清楚对千差万别的字符编码以及那些很少使用的 XML 成分(比如处理指令)提供什么样的支持。另外,多数情况下它们都只存在一个创始人,因此其想法很可能逐渐消亡。

在一年前我第一次撰写这个主题的时候,开发人员兼作者 Michael Champion 给出了回应,鼓励我不要忽视 XML 1.0 的互操作性及其对网络带来的影响,这些是 XML 的主要价值所在,也是使我们走到今天这一步的主要原因。

在通用的 XML 替代语法之外,特定于应用的非 XML 语法似乎有更大的价值,特别是在那些需要创建大量内容的地方。比如 Wiki 标记与直接编写 DocBook XML 相比可以节约大量的时间。(Eric van der Vlist 曾经用这种方法编写过整整一本书。)当然,您不必获得 DocBook 的所有功能,但是在易于编辑方面有一个合理的权衡。RELAX NG Compact 是一个很好的例子,说明了非 XML 语法确实能够揭示语言的底层概念和数据结构的秘密——经过 RNG 委员会批准这一事实,为其前景也提供了某些保证。

那么能否得出结论说最好使用一种非 XML 语法呢?说 使用要更容易一些:如果与 XML 1.0 相比带来的受益很小,或者把数据保存到 XML 1.0 的方法很脆弱或者容易丢失,那么就不使用。一个好的经验是考虑内容是什么时候创建的,是否需要经常交换。适合使用非 XML 语法的一种情况是,从头到尾一次完成内容的创建,而且不需要交换或者在转化成 XML 1.0 之后再交换。我完全不认为“哦,我可以继续在 Emacs 中使用 Python 方式”这种说法是非常合理的,因为除了某些个人项目外,从 XML 中取出数据毫无意义。

易于创建内容仍然是我所见过的有关使用替代 XML 表示最激烈的争论。编辑器开发似乎是计算中最棘手的难题之一,而且很少能找到帮助。


参考资料

关于作者

Edd Dumbill 是 XML.com的执行编辑,XML 开发人员新闻网站 XMLhack的编辑兼发行人。他还是 O'Reilly 出版的 Programming Web Services with XML-RPC一书的作者之一, Pharmalicensing生命科学知识产权交换的奠基人之一和顾问。 Edd 也是 XML Europe大会的执行主席。可以通过 edd@xml.com与他联系。

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


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


忘记密码?
更改您的密码

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

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

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

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

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


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

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=XML
ArticleID=20810
ArticleTitle=XML 观察: 探索 XML 的替代语法
publish-date=12012003
author1-email=edd@xml.com
author1-email-cc=

标签

Help
使用 搜索 文本框在 My developerWorks 中查找包含该标签的所有内容。

使用 滑动条 调节标签的数量。

热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。

我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。

使用搜索文本框在 My developerWorks 中查找包含该标签的所有内容。热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。