如您所见,编辑界面很象任何其它 WYSIWYG(所见即所得)字处理器屏幕(OpenOffice 用户界面不在本文讨论范围之内)。我将文件保存为 document.sxw。由于所有文件都是以 OpenOffice 本机格式保存的,所以这实际上是一个包括一组 XML 和其它支持文件的 ZIP 文件 一种称为 OpenOffice 包格式的捆绑包。关于使归档文件约定标准化以打包多个相关的 XML 文档及其支持文件的想法,是一种流行的和惯用的思想:XML 专家 Rick Jelliffe 开发了一种基于 ZIP 的 XML 应用程序归档(XML Application Archive,XAR)格式;还有直接因特网消息封装(Direct Internet Message Encapsulation,DIME),它是一个因特网草案(Internet Draft),但要复杂得多,并且主要是针对消息传递和 Web 服务而不是通用的归档文件。OpenOffice 使用它自己的格式,接下来我将研究这种格式。请参阅 参考资料以获取关于这些格式的更多信息。
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)document.sxw的 ZIP 内容如下:
$ unzip -v document.sxwArchive: document.sxwLength Method Size Ratio Date Time CRC-32 Name-------- ------ ------- ----- ---- ---- ------ ----2946 Defl:N 965 67% 12-13-02 04:03 44fee85c content.xml4638 Defl:N 1199 74% 12-13-02 04:03 791e906a styles.xml1120 Stored 1120 0% 12-13-02 04:03 a921529c meta.xml6183 Defl:N 1362 78% 12-13-02 04:03 c8586553 settings.xml752 Defl:N 254 66% 12-13-02 04:03 11144701 META-INF/manifest.xml-------- ------- --- -------15639 4900 69% 5 files
第一站是 META-INF/manifest.xml,它在某种程度上担任包中所有其它文件的中央目录。 清单 1是来自我样本文档的清单文件。
清单 1:图 1 中所示的已保存样本文档的清单
?xml version="1.0" encoding="UTF-8"?!DOCTYPE manifest:manifest PUBLIC "-//OpenOffice.org//DTD Manifest 1.0//EN""Manifest.dtd"manifest:manifest xmlns:manifest="http://openoffice.org/2001/manifest"manifest:file-entry manifest:media-type="application/vnd.sun.xml.writer"manifest:full-path="/"/manifest:file-entry manifest:media-type="" manifest:full-path="Pictures/"/manifest:file-entry manifest:media-type="text/xml" manifest:full-path="content.xml"/manifest:file-entry manifest:media-type="text/xml" manifest:full-path="styles.xml"/manifest:file-entry manifest:media-type="text/xml" manifest:full-path="meta.xml"/manifest:file-entry manifest:media-type="text/xml" manifest:full-path="settings.xml"//manifest:manifest
所有 OpenOffice 格式都使用 DTD,我认为这样很好,因为拥有一个模式,有助于强制格式的互操作性,并且选择 DTD 还确保了对 XML 工具的最广泛支持。警告:要用通用的 XML 工具处理这些文件,您要么必须使用编目(catalog)以解析公用标识,将被指定为系统标识的 Manifest.dtd 文件复制到相同目录中,要么仅使用不读取外部 DTD 子集的工具。OpenOffice 为所需的 DTD 和实体维护一个内部编目。可以在 OpenOffice 安装的共享目录中找到 OpenOffice DTD。例如,在我的 Red Hat 8.0 安装中,它们位于 /usr/lib/openoffice/share/dtd/ 中,而清单 DTD 在 /usr/lib/openoffice/share/dtd/officedocument/1_0/ 中。您也可以在线从 OpenOffice 网站(请参阅 参考资料)下载或访问这些 DTD。清单文件使用公共的 OpenOffice 名称空间,并通常包括一个向每个文件提供因特网媒体类型(IMT)和相关 URL 的项元素列表。用于子文件夹的 media-type 属性是空的(例如我示例中的 Pictures 文件夹),但通常会在这些子文件夹中包含任何嵌入图形的图形源文件。
meta.xml包括一系列具有文档元数据的元素(如创建和最后编辑日期、已经花费在编辑该文档上的总时间、字数、页数、表数和图数等元素)。您可以将 styles.xml看作 XML 格式中的级联样式表(CSS)和 XSL 格式化对象(XSL-Formatting Objects,XSL-FO)之间的交叉点。它定义了各种样式,这些样式可用于文档的字体、间距、修饰、间隔、制表符停止位等方面编辑会话。它命名了所有样式,因此您可以在其它文件中引用它们。 settings.xml记录用户对 OpenOffice 用户界面的用户首选项。这些涉及到用来编辑文档的应用程序的细节,而不是文档本身的任何细节。这个领域还需要完成一些工作以确保互操作性。总之,如果在多个应用程序(都使用 OpenOffice 格式)中编辑同一文档,不能期望每个应用程序都维护同样类型的设置 但即使如此,又如何防止它们发生冲突呢?
处理内容
文档的核心(实际内容)在 content.xml中。遗憾的是,在文本编辑器中,乍看上去这个文件中的元素有点过于混乱,但是您可以用多种常见的 XML 工具(包括 XSLT)抽取出字符数据,允许使用空样式表(请参阅 清单 2)。
清单 2:空 XSLT 样式表
xsl:stylesheetxmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0"xsl:output method="text"//xsl:stylesheet