首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

XML 问题 比微格式更轻巧:纤格式(Picoformat)-1

XML 问题 比微格式更轻巧:纤格式(Picoformat)-1

XML 既用于标记文档也用于标记结构化数据,是好是坏有各种不同的解释,这要看您采用哪种观点了。对于文档和数据界限模糊的地方来说 XML 可能是赢家,但是作为一种通用解决方案,对一个问题来说 XML 可能比任何给定的具体解决方案都更复杂。David 此前曾经讨论过 YAML(请参阅)。YAML Ain't Markup Language 或 Yet Another Markup Language(YAML)是一种方言,以提供比 XML 更简单的数据(数字、字符串、列表、简单结构)传输为目标。本文中我们将讨论 JSON(JavaScript Object Notation),它是 YAML 的一个真子集,但是更容易创建和解析。在 JavaScript 和 Python 中,如果 JSON 的来源可靠,可以直接用脚本引擎求值,对于来源不可靠的 JSON 也有相应的解析器可用。
虽然 JSON 的应用靠近文档-数据谱系中的数据一端,也可用结构文本格式处理文档色彩较浓的微格式。有三种主要的结构化文本方法(不算各种各样的 Wiki 标记):reStructured Text、Markdown 和 Textile。我们将分析这三种格式,至少从理论上看看它们如何处理微格式例子。
微格式中 什么?微格式包含什么样的数据?微格式的要旨是将(通常)少量的数据,放入一个容易供人或机器处理的格式中,如果忽略这一限制把数据按照人类阅读机器处理(但不能同时)的需要编码,然后处理以得到微格式版本就会带来一些好处。hCalendar 通常的例子包括下列信息:
  • 摘要/标题
  • 位置
  • URL
  • 起始日期(以及可选的时间)
  • 结束日期(和可选的时间)
  • 时区
  • 说明
需要编码的就这么多。 显示了一个 hCalendar 事件的例子:
清单 1. hCalendar 事件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<div class="vevent">
    <a class="url"
        href="http://www.vanpyz.org/conference/keynotes.html">
        <abbr class="dtstart" title="20060804T1900-0700">
            August 4, 2006 - 19:00
        </abbr> -
        <abbr class="dtend" title="20060804T2100-0700">
            21:00
        </abbr> -
        <span class="summary">
            Vancouver Python Workshop Keynotes
        </span> - at
        <span class="location">
            Fletcher Challenge Canada Theatre,
            SFU Harbour Center,
            Downtown Vancouver
        </span>
    </a>
    <div class="description">
        <p>The Vancouver Python Workshop keynote address is an
        opportunity to hear from leading members of the Python
        community. This years speakers are Guido van Rossum of
        Google and Jim Hugunin from Microsoft.</p>
    </div>
</div>




如果只留下基本的数据,可以用 JSON 编码同样的事件。要注意日期、时间和时区都是用 ISO8601 编码,这是格式化日期和时间的标准格式,它本身也是一种微格式(请参阅)。 中的例子在 JavaScript 或 Python 中都是合法的代码:
清单 2. 使用 JSON 编码
1
2
3
4
5
6
7
8
9
10
11
event = {
    'title':  'Vancouver Python Workshop Keynotes',
    'location': 'Fletcher Challenge Canada Theatre, \
                 SFU Harbour Center, Downtown Vancouver',
    'url': 'http://www.vanpyz.org/conference/keynotes.html',
    'start': '2006-08-04T19:00-0700',
    'end': '2006-08-04T21:00-0700',
    'description': 'The Vancouver Python Workshop keynote address\
     is an opportunity to hear from leading members of the Python\
     community. This years speakers are Guido van Rossum of Google\
     and Jim Hugunin from Microsoft.'};




下面将看到,这种格式也很容易在 Web 上传播。故事变得有趣了……
您从我的文档中得到了数据!对微格式内容使用 JSON 代表了数据一端。对于文档方面,我们可以从结构化文本开始接近微格式。如果使用 reStructured Text 编写 hCalendar 是什么样子呢?当然,reST 允许使用指令创建插件扩展,因此解析类 hCalendar 数据的指令可以是这样:
1
2
3
4
5
6
7
8
9
10
11
.. event::

    LOCATION: Fletcher Challenge Canada Theatre,
    SFU Harbour Center, Downtown Vancouver
    DTSTART: TZID=America/Vancouver:20060804T190000
    DTEND: TZID=America/Vancouver:20060804T210000
    SUMMARY: Vancouver Python Workshop Keynotes
    DESCRIPTION: The Vancouver Python Workshop keynote address
    is an opportunity to hear from leading members of the Python
    community. This years speakers are Guido van Rossum of Google
    and Jim Hugunin from Microsoft.




关于这种思路有趣的地方是:hCalendar 规范是从原来的 iCalendar 标准到一个 HTML 子集的映射。那么这种神秘的 iCalendar 什么样子呢? 显示了 iCalendar 中的相同事件:
清单 3. iCalendar 中的事件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Apple Computer\, Inc//iCal 2.0//EN
BEGIN:VEVENT
DURATIONT3H
LOCATION: Fletcher Challenge Canada Theatre,
SFU Harbour Center, Downtown Vancouver
DTSTAMP:20060615T034522Z
UID:FE31377A-AB78-4D99-BC25-3F09C99E5928
DTSTART;TZID=America/Vancouver:20060704T100000
SUMMARY:Vancouver Python Workshop Keynotes
DESCRIPTION:The Vancouver Python Workshop keynote address
is an opportunity to hear from leading members of the Python
community. This years speakers are Guido van Rossum of Google
and Jim Hugunin from Microsoft.
END:VEVENT
END:VCALENDAR




是的,iCalendar 是一种基于文本的格式,解析比较简单,可以找到解析这种格式的库,可用选择的任何语言操作结果。因此如果实现了获取 hCalendar 全部数据元素的 reStructured Text 指令,只要修改 .. include:: 指令就可以将 iCalendar 内容直接格式化为 hCalendar 。由于存在大量导入导出 iCalendar 格式的工具,比如 Apple 的 iCal,直接重用这种格式可能更好一些。我们不准备详细讨论如何添加或修改 reStructured Text 中的指令,不仅为了简洁,还因为 Dethe 已经与 reStructured Text 的主要开发人员 David Goodger 合作撰写那方面的教程(请参阅 )。
轻于空气,但难以呼吸虽然 JSON 提供了一种比 YAML 或 XML 都简单的数据格式,但是 reStructured Text 是一种非常复杂的工具。reStructured Text 文档可能比 XML 更易于阅读,如果您不打算利用它的全部特性,它也更加简单。但是如果添加了很多的指令、表格和其他特性,Dethe 的 Complexity Meter 就会变得困难起来。既然 JSON 通过规范(一种常见的折中方案,导致了 Domain Specific Language 即 DSL 的出现)获得了简化,如果愿意牺牲 reStructured Text 的一些功能和灵活性还可以进一步简化结构化文本。而且这种比轻量级的以文档为中心的格式更加轻巧的格式已经存在了。
我们将讨论 Textile 和 MarkDown,这两种更加轻量级的结构化文本格式简化了微格式数据的创建。遗憾的是,那些使这两种工具在创建以文档为中心的内容方面获得成功的特性,对于更加面向数据的工作比如 hCalendar 却毫无帮助。Textile 没有 <div> 或 <abbr> 标记,也没有为 <a> 添加类的任何办法。虽然它非常灵活,很容易添加 class、id 和 style 属性,却无法添加 title 属性。Markdown 根本没有添加属性的机制(虽然 PyMarkdown 有一种支持属性的扩展),也没有 <div> 或 <abbr> 这样的结构。两个系统都能传递预格式化的 HTML,但这样就完全失去了使用一种轻量级格式的好处。
这些轻量级标记语言缺乏对微格式的支持是可以理解的。从本质上来说微格式就是数据,而 Textile 和 MarkDown 都是用于 Web 创作的工具。它们的目标是帮助您容易找到需要的字,加上一点格式,但是忽视了插入机器可读数据的问题。XML 的老问题之一,即同时用于数据(机器可读的信息)和内容(人类易懂的文本)。结构化文本格式紧靠在内容一端,而 YAML 和 JSON 则在数据一端。每一种格式可能都做得不错或者比 XML 好,但是在数据和内容的边界不那么清晰的地方,比如微格式,这些语言都很难逾越界线。
返回列表