IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  XML  >

XML 问题: XML 用于字处理程序

开放源代码采用 XML 作为本地文档格式

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 中级

David Mertz, Ph.D. (mertz@gnosis.cx), 藏书家, Gnosis Software, Inc.

2004 年 2 月 01 日

三个主要自由软件字处理程序的最新版本都采用了 XML 作为本地文档格式。AbiWord、KOffice 的 KWord 以及 OpenOffice.org Writer 这些应用程序之间应用 XML 的方法有些不同——在很大程度上反映了每个项目底层开发所关注的焦点不同。David 在这里分析指出,这些项目以及所有开放源代码字处理程序的开发人员都认识到了采用 XML 作为文档格式的优势:解析器和书写程序的组件化;格式规范的开放性和正式性;可以应用 XSLT 和其他转换 API。您可以参与讨论论坛与作者和其他读者分享您对本文的想法。

除了少数已经放弃或者未完成的努力之外,这三种字处理程序的可用版本都处于主动维护状态。作为字处理程序,三者都很出色,都提供了各种有用的导入/导出功能——包括广泛应用但是私有的 Microsoft Word 格式,而且都为 Linux 和其他平台(无论自由操作系统还是私有操作系统)提供了源码和二进制两种形式。而且 AbiWord、KWord 和 Writer 都使用 XML 作为本地文档格式——这也是本专栏最感兴趣的地方。

对于本专栏而言,我不希望比较这三个项目的特性、表现或者用户界面。只要说它们在观感上都雕琢得精美绝伦,都为创建大多数类型的业务和个人文档提供了足够的特性集,这样就够了。这里所关心的是 XML 文档格式的设计——这些项目的内脏。

对于不熟悉这三个项目的人而言,还需要简单地介绍一下。AbiWord 是一个独立的字处理程序,强调跨平台的兼容性、大小适中和执行速度。OpenOffice.org 是 Sun Microsystems 的 StarOffice 产品的分枝,在自由软件许可下发布,由开发者社区接纳。OpenOffice.org Writer 是能够互操作的应用程序包的一部分,其中包括电子表格、向量绘图程序、表示应用程序以及其他组件。类似地,KWord 是 KOffice 软件包(它本身属于整个 KDE 项目)的一部分,KOffice 包含的组件甚至比 OpenOffice.org 还多——增加了流程图、光栅图像编辑、图表和其他应用程序。无论如何,现在我们只关心 KOffice 和 OpenOffice.org 的字处理组件。

其他的选择:LyX

还有一个自由软件应用程序也值得顺便一提,它就是 LyX,该程序是创建 LaTeX 文档的 GUI 前端。对于专门化的技术文档——比如包含许多公式和复杂交叉索引的文档——LyX 是一个很好的选择,但对于创建一般的商业信函来讲它的学习过程太艰难了。

测试文档格式

如您所料,这些开放源代码字处理程序的新版本通常会稍微改变一下文档格式。所幸的是,XML 非常适合上述变化,可以包含附加的(可选的)新属性和新子元素。如果做得好,应用程序的早期版本在读取较新的保存文档时甚至可以相对温婉地降级使用——通常只需要忽略不能识别的标签和属性。

在我考察的 XML 格式中,DTD 由项目的开发人员提供,但是往往不能与相同版本的应用程序所创建的 XML 文档同步。如您的期望一样,结构良好性仍然得到尊重,但是创建与解析似乎就不那么正规了,无论如何格式是在源代码中实现的,而不是在 DTD 或者模式中实现的。换句话说,下面的例子 能通过验证。为便于了解文档 到底 是什么样子,我创建了一个非常简单的测试文档,如图 1 所示:


图 1. 简单文档的截图
图 1. 简单文档的截图

有意思的是——如果不能算吃惊的话,您会从该文档的 XML 版本中发现同一文档的表示不是唯一的。(当然,这是 XML,像空白字符标准化这样的问题允许不等同的文件表示相同的 Infoset,但这里指的不是这个。)我发现,至少在细节上,由于用户在创建文档中执行动作的顺序(也可能由于其他因素)不同,完全相同的格式可能使用不同的标记。尽管这一点不一定成为问题——而且像 Microsoft Word 的 .doc 这样的二进制文档格式也可能采用——但美中不足的是规范化在语义层上就不像在 XML 中的语法层上那么直观了。





回页首


从简单开始:AbiWord

AbiWord 使用一种相对简单直接的 XML 文档格式,表现和布局在类 CSS 的属性中规定。尽管这些属性许多直接取自 CSS,AbiWord 的开发人员认为 CSS 不能完全满足他们的需要,因此他们仅仅把它作为一个起点。

尽管有点长,我还是愿意列出所创建的字处理程序文档的全部 XML 源代码。这些源代码经过了修饰,但是这些修改没有影响 Infoset,经验证不需要重新导入。首先是 AbiWord 版本:


清单 1. simple.abw AbiWord 文档
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE abiword PUBLIC "-//ABISOURCE//DTD AWML 1.0 Strict//EN"
                         "http://www.abisource.com/awml.dtd">
<abiword
  fileformat="1.1"
  props="dom-dir:ltr; lang:en-US"
  styles="unlocked"
  template="false"
  version="2.0.3"
  xml:space="preserve"
  xmlns="http://www.abisource.com/awml.dtd"
  xmlns:awml="http://www.abisource.com/awml.dtd"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:fo="http://www.w3.org/1999/XSL/Format"
  xmlns:math="http://www.w3.org/1998/Math/MathML"
  xmlns:svg="http://www.w3.org/2000/svg"
  xmlns:xlink="http://www.w3.org/1999/xlink">
  <metadata>
    <m key="dc.format">application/x-abiword</m>
    <m key="abiword.generator">AbiWord</m>
    <m key="abiword.date_last_changed">Tue Feb 10 20:04:46 2004</m>
  </metadata>
  <styles>
    <s followedby="Current Settings"
       name="Normal"
       props="text-indent:0in; margin-top:0pt; margin-left:0pt;
              font-stretch:normal; line-height:1.0; text-align:left;
              bgcolor:transparent; lang:en-US; dom-dir:ltr;
              margin-bottom:0pt; text-decoration:none;
              font-weight:normal; font-variant:normal; color:000000;
              text-position:normal; font-size:12pt; margin-right:0pt;
              font-style:normal; widows:2; font-family:Times New Roman"
       type="P"/>
  </styles>
  <pagesize height="11.000000"
            orientation="portrait"
            page-scale="1.000000"
            pagetype="Letter"
            units="in"
            width="8.500000"/>
  <section props="page-margin-footer:0.5in; page-margin-header:0.5in">
    <p style="Normal">Minimal document with <c
       props="font-weight:bold">bold</c><c
       props="font-weight:normal"> and </c><c
       props="font-style:italic; font-weight:normal">italics</c><c
       props="font-style:normal; font-weight:normal">.</c></p>
    <p style="Normal"><c
       props="font-style:normal; font-weight:normal"/></p>
    <p style="Normal"><c
       props="font-style:normal;
              font-weight:normal">New paragraph with </c><c
       props="font-weight:normal;
              text-decoration:underline;
              font-style:normal">underline</c><c
       props="text-decoration:none;
              font-weight:normal;
              font-style:normal">.</c></p>
  </section>
</abiword>

有几个特点很突出。XML 一个值得注意的优点是使用名称空间指明其他团队开发和改进的外部模式。比如,包含公式或者图片可以分别使用 MathML 或 SVG 实现,AbiWord 开发人员不需要自己重新实现这些功能。

关于 AbiWord 格式值得注意的另外一点是,它并没有完全使用 XML 属性描述章节或者字符区域的呈现。就是说,其中一些 XML 格式试图 事先 列出属性或子标签(在 DTD 中命名)中所有可能的格式,AbiWord 只是插入包含 CSS 样式格式的通用 props 属性。这样就把呈现的语义推到了 XML Infoset 之外(是好是坏还不能肯定)。





回页首


走向正规:OASIS

Sun Microsystems 为 StarOffice(属于 OpenOffice.org)开发的 XML 格式已经被一个 OASIS 技术委员会(请参阅 参考资料)所采用,简而言之,它即将成为一个标准而不仅仅是一种格式。另外,KOffice 项目最初使用自己的 XML 格式,最近已经决定把其本地格式转向 OpenOffice.org 格式——或者将来 OASIS 对这种格式的增强版。因此,我认为介绍 OASIS/OpenOffice.org 格式比详细分析过去的 KOffice 格式更有意义。就是说,在撰写本文时当前的 KOffice 稳定版本还没有切换到新的格式。

与 AbiWord 格式不同,OpenOffice.org 的 XML 格式包括了 OpenOffice.org 应用程序支持的所有文档类型——不仅仅是字处理文档,还包括图表、绘图等等。不同类型的数据用每种类型的名称空间指定,允许同一文档中嵌入多种数据格式。特定的应用程序如何处理和是否处理给定的数据类型取决于应用程序本身,但是应用程序可以把给定数据类型的,比方说呈现控制,传递给另一个组件(无论同一软件包内的组件还是完全独立的应用程序)。

现在我们只关心 图 1中所示的简单字处理程序文档。看一看,然后与 清单 1中的 AbiWord 版本和 清单 2 中的 OpenOffice.org XML 格式比较。这里的代码和 AbiWord 版本一样也作了修饰,但保留 Infoset 不变。另外,该文档也同 AbiWord 的一样实际上未经验证,其中的 dr3dformmath 名称空间属性,在我安装的 OpenOffice.org(即编写本文所使用的)所带 DTD 中没有出现。尽管我们所关心的内容都显示在清单 2 中,但是完整的 OpenOffice.org 数据文件是一个 .zip 压缩包,包含用于设置、元数据和样式的几个辅助 XML 文件(通常使用扩展名 .sxw ):


清单 2. simple.sxw 中的 content.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE office:document-content PUBLIC
  "-//OpenOffice.org//DTD OfficeDocument 1.0//EN"
  "office.dtd">
<office:document-content office:class="text" office:version="1.0"
  xmlns:chart="http://openoffice.org/2000/chart"
  xmlns:dr3d="http://openoffice.org/2000/dr3d"
  xmlns:draw="http://openoffice.org/2000/drawing"
  xmlns:fo="http://www.w3.org/1999/XSL/Format"
  xmlns:form="http://openoffice.org/2000/form"
  xmlns:math="http://www.w3.org/1998/Math/MathML"
  xmlns:number="http://openoffice.org/2000/datastyle"
  xmlns:office="http://openoffice.org/2000/office"
  xmlns:script="http://openoffice.org/2000/script"
  xmlns:style="http://openoffice.org/2000/style"
  xmlns:svg="http://www.w3.org/2000/svg"
  xmlns:table="http://openoffice.org/2000/table"
  xmlns:text="http://openoffice.org/2000/text"
  xmlns:xlink="http://www.w3.org/1999/xlink">
  <office:script/>
  <office:font-decls>
    <style:font-decl fo:font-family=""
                     style:font-pitch="variable" style:name="F"/>
    <style:font-decl fo:font-family="Mincho"
                     style:font-pitch="variable" style:name="Mincho"/>
    <style:font-decl fo:font-family="Times"
                     style:font-family-generic="roman"
                     style:font-pitch="variable"
                     style:name="Times"/>
  </office:font-decls>
  <office:automatic-styles>
    <style:style style:family="paragraph"
                 style:name="P1" style:parent-style-name="Standard">
      <style:properties fo:font-style="normal"
                        fo:font-weight="normal"/>
    </style:style>
    <style:style style:family="text" style:name="T1">
      <style:properties fo:font-weight="bold"/>
    </style:style>
    <style:style style:family="text" style:name="T2">
      <style:properties fo:font-weight="normal"/>
    </style:style>
    <style:style style:family="text" style:name="T3">
      <style:properties fo:font-style="italic" fo:font-weight="normal"/>
    </style:style>
    <style:style style:family="text" style:name="T4">
      <style:properties fo:font-style="normal" fo:font-weight="normal"/>
    </style:style>
    <style:style style:family="text" style:name="T5">
      <style:properties style:text-underline="single"
                        style:text-underline-color="font-color"/>
    </style:style>
  </office:automatic-styles>
  <office:body>
    <text:sequence-decls>
      <text:sequence-decl
        text:display-outline-level="0" text:name="Illustration"/>
      <text:sequence-decl
        text:display-outline-level="0" text:name="Table"/>
      <text:sequence-decl
        text:display-outline-level="0" text:name="Text"/>
      <text:sequence-decl
        text:display-outline-level="0" text:name="Drawing"/>
    </text:sequence-decls>
    <text:p
      text:style-name="Standard">Minimal document with <text:span
      text:style-name="T1">bold </text:span><text:span
      text:style-name="T2">and </text:span><text:span
      text:style-name="T3">italics</text:span><text:span
      text:style-name="T4">.</text:span>
    </text:p>
    <text:p text:style-name="P1"/>
    <text:p text:style-name="P1">New paragraph with <text:span
      text:style-name="T5">underline</text:span>.</text:p>
  </office:body>
</office:document-content>

OpenOffice.org 格式采用的结构基本上与 AbiWord 类似。与 AbiWord 的 <p> 标签不同,OpenOffice.org 使用的是 <text:p> ;而 AbiWord 中的 <c> 在 OpenOffice.org 中则用 <text:span> 代替。一个显著的区别是,AbiWord 直接伴随着标记的字符序列使用格式化描述,而 OpenOffice.org 总是间接引用命名的样式,即使自动样式的名称是由生成程序仓促生成的。

该实例文档也验证了上面提到的文档 Infoset 的意外变动。比方说,请注意第一段后面的句点被标记为样式 T4,而最后一段中的句点则在任何样式作用范围之外。此外,如果看一看前面的 T4 样式定义,就会发现基本上定义了常规的——即默认的——字体样式和粗细。换句话说,根本不需要使用 T4 样式标记文本,只要保留这些段落作为 PCDATA 就可以了。





回页首


处理 XML 文档

由此可以看出,在字处理程序中使用这类 XML 格式的一大优点在于使用新工具访问这些文档非常方便。与二进制格式尤其是那些私有格式相比,编写处理 XML 字处理程序文档的新应用程序要简单得多。RTF(富文本格式)从一定程度上讲也实现了这个目标——它是一种公开描述的文本标记格式。但是与 RTF 解析器相比显然有更多的常用 XML 解析器可供选择。

显然,人们想到的处理 XML 字处理程序格式的应用程序都是新的字处理应用程序。预料之中的 KOffice (KWord) 与 OpenOffice.org (Writer) 之间的透明互操作性就是其中的一个例子。但一些更加朴素的应用程序也应该记住:索引、分析、摘要、比较或者成批处理文档都是常常遇到的任务。

对于许多批处理方式的应用程序,XSLT 作为一种显然的处理语言非常杰出——事实上,现有的转换例程常常使用 XSLT。不过和那些支持者相比,我不是很喜欢 XSLT。不论这种语言所宣称的目标如何,我经常发现它在细节上容易造成混乱,难以维护与调试。无论如何, 清单 3 中所示的都一个非常简单的工具,它利用了 gnosis.xml.objectify Python XML 绑定——本专栏中曾多次讨论过。这个工具和 lynx 中的 -dump 选项类似,只不过它处理的是 OpenOffice.org Writer 文档而非 HTML 文档。这个工具尽管粗糙,但也非常精确,从而也验证了 XML 的一些优点:


清单 3. dumpOO.py
        #!/usr/bin/env python
import sys, zipfile
        from gnosis.xml.objectify 
        import XML_Objectify, EXPAT, \
                                 children, tagname, content
XML_Objectify.expat_kwargs[
        'nspace_sep'] = None
doc_content = zipfile.ZipFile(sys.argv[
        1]).read(
        'content.xml')
doc = XML_Objectify(doc_content).make_instance()
write = sys.stdout.write
        for o 
        in children(doc.office_body):
    
        if tagname(o)==
        "text_p":
        
        for s 
        in content(o):
            
        if type(s) 
        is unicode 
        and s.strip():
                write(
        " "+s.encode(
        'utf-8').strip())
            
        elif tagname(s)==
        'text_span':
                write(
        " "+s.PCDATA.encode(
        'utf-8'))
        write(
        '\n')
      

该工具不一定能优美地处理每种 OpenOffice.org 结构(但我认为能够处理所有的文本内容),而且没有对段落进行行包装。但是,使用 Python 2.3+ 模块 textwrap 或者导入外部工具 fmt 很容易就能增加这种功能。比如:


清单 4. 执行 dumpOO.py
$ ./dumpOO.py simple.sxw | fmt
 Minimal document with bold and italics .
 New paragraph with underline .





回页首


结束语

自由软件与 XML 文档格式是天生的一对。XML 固有的可读性使得交换与格式规范化更容易,而 XML 库的广泛应用又使得新工具的创建很简单。此外,分析这些字处理程序格式确实让我看到了名称空间的模块化好处——正确使用名称空间能够利用许多独立开发人员组织所做的工作。

但是,就 XML 本身而言只能走到这一步。比如,Microsoft 也准备在将来的 MS Word 版本中转向 XML,但是与 OASIS/OpenOffice.org 或 AbiWord 格式的开放性不同,Microsoft 使用专利应用程序把它的格式围起来,并在格式的变化上盖上一层秘密的面纱(再加上使用神秘的而不是意义自明的标签和属性名)。

XML 本身并不真正意味着 开放,但所幸的是,KOffice、AbiWord 和 OpenOffice.org 的开发人员在获得 XML 的开放性方面做了总体上非常卓越的工作(虽然,狂热的社区开发还留下了一些偶然的小错误,比如在 DTD 中)。



参考资料

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文.

  • 请在 讨论论坛上参与有关本文的讨论。(您也可以单击本文顶部或底部的 讨论来访问论坛。)



  • 看一看采用混合自由软件许可证的 OpenOffice.org(都经过 FSF 与 OSI 核准)。根据所感兴趣的组件,您可以采用 PDL、GPL、LGPL 或 SISSL,此外也可以选择能够接受的许可条目。该站点也包括该项目以及许可规定的一般信息。



  • 下载 KWord,它是 KOffice 项目的一部分(在 General Public License 下)。还可以找到 KOffice 组件所用的 一组 DTD



  • 根据 2003 KOffice 开发人员大会,KOffice 项目宣布计划转而采用 OASIS/OpenOffice.org 作为其本地文件格式。



  • 看一看 Abiword 站点,其中提供了下载(在 General Public License 下可用)。您还可以看到(未定的) DTD for AbiWord(或者保存为文件以后再查看)。



  • 已经组织了一个 OASIS 技术委员会为办公应用程序建立开放的、基于 XML 的文件格式规范。该规范的基础是 Sun 创建的 StarOffice/OpenOffice.org 格式规范。



  • 在 OpenOffice.org 上阅读 办公软件包之间的文档格式标准化



  • 如果您创建专门的技术文档,可以考虑使用 LyX应用程序。



  • developerWorks Developer Bookstore中浏览各种与 XML 技术有关的书籍。



  • 可以在 developerWorksXML 专区 找到更多的 XML 资源。您可以在 专栏汇总页面找到 David XML 问题 专栏以前各期的文章。



  • 了解如何才能成为一名 IBM 认证的 XML 及相关技术的开发人员




关于作者

Author photo

David Mertz 希望一切都变得美好。可以通过 mertz@gnosis.cx 与 David 联系;在 http://gnosis.cx/publish/ 上详细介绍了他的生活。欢迎对过去的、这一篇和以后的专栏文章提出意见和建议。您可以在 http//gnosis.cx/TPiP/ 了解 David 的新书 Text Processing in Python。




对本文的评价










回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款