处理 OpenOffice.org 基于 XML 的文档格式

日常办公套件,力所不能及

  有时您会处于这样一种境地,即所使用的办公套件具有 500,000 种特性 却无一符合自己的需要。无论办公套件中加入了多少特性,我们总会发现一些重复的工作令人头痛不已,如果这些乏味的工作能够自动完成的话,那么将省下许多麻烦。

  比如说,OpenOffice.org 能生成对索引的引用。敲击几次键盘便可以生成数千条引用。但是当您想要删除它们时,情况又是如何呢?答案是您只能一条一条地删除它们。这样一来,如果想要更改编入索引的关键字,那么您会发现这是一个痛苦的过程。

   您自己可能还会想到一些其他的例子。根据所使用的办公套件,您也许可以使用 StarOffice Basic 或 Microsoft® Visual Basic® for Applications (VBA) 采用编程的方法解决一些问题。但如果您对编程一窍不通,或者您知道如何编程但是却发现这样做更加费时费力,那又该如何是好呢?

  得益于日 趋流行的 XML 文档格式,您也许不用编程便可以迅速解决问题,当然这要取决于问题的类型。使用一些已有的 XML 知识,比如通用 XML 扩展(如名称空间)和基于 XML 的通用文件格式(如可扩展超文本标记语言 [XHTML] 和可缩放矢量图形[SVG]),您可以在短时间内对文档进行大量的修改,而这在办公套件中却不是那么容易实现的。在这一方 面,OpenOffice.org 中的 ODF 就特别方便好用,因此在本文的示例中我将主要使用 OpenOffice 格式。

  OpenDocument Format

   ODF 的好处就是极具简单性。这种格式在 OpenOffice.org 中使用,它由一个简单的 Java™ Archive File (JAR) 文件构成,这个 JAR 文件是一个压缩 (.zip) 文件,其中包含一个清单。这个压缩文件中包含一系列 XML 文件,分别对文档的各个不同部分进行了说明。

  看看一个 OpenOffice.org 文档的例子。使用 OpenOffice.org(请参阅 参考资料 获得下载信息)创建一个新文本文档。键入 Hello world!,然后保存并关闭文档。确保文件保存为开放文档文本 (ODT) 格式(使用 .odt 扩展名)。

  同样,OpenOffice.org 文本文档基本都是压缩文件。因此要取出某个文件,大多数人都会采用如下这个最简单的方法:

  复制一个文档副本(以使原始文件不被损害)。

  使用 .zip 扩展名重命名该副本。

  使用喜好的压缩工具(比如说 unzip、WinZip 或 Microsoft Windows® Explorer)解压这个压缩文件。

  解压压缩文件时,文件中应该大致包含如下内容:

  Configurations2 (directory)

  META-INF (directory)

  Thumbnails (directory)

  content.xml

  meta.xml

  mimetype

  settings.xml

  styles.xml

  这些目录中并没有包含任何可能需要编辑的内容。事实上,目前惟一令我困扰的就是 表 1 中所描述的文件。

  表 1. ODF 文本文档文件

FileDescription
content.xml包含所有的文档文本以及索引标记、样式信息的链接等等。该文件是文档的主体。
meta.xml包含文件元数据,比如说作者和文档标题。
styles.xml定 义文本的格式,比如字体的更改、段落方向、页面样式等等。如果您对 Web 设计比较熟悉,那么您就知道 styles.xml 功能等同于 CSS 样式表。ODF 会尽可能地保持样式与内容分离,因此 content.xml 文件中不会混入任何此类信息的说明。最多是含有一些从内容到样式的链接。
Thumbnails/thumbnail.png提供文档第一个页面的缩略图。

  掌握 XML

  正如一些设计相当良好的 XML 格式,文档文件并不是特别难于理解。XML 标记所使用的名字往往不言自明,因此我们可以大致猜出它们的意思。(当然,如果您不乐于猜测,那么可以阅读 ODF 文档。请参阅 参考资料 获得更多信息。)表 2 提供了一些示例。

  表 2. XML 标记

TagDescription
<office:document-content>根标记。注意,所有的 XML 名称空间(包括 office)都定义在这个标记中。
<office:font-face-decls>包含文档中所使用的字体。
<office:automatic-styles>包含最基本的样式。styles.xml 文件对这些样式作出了详细说明。
<office:body>包含文档的主体。
<text:p>对应于 HTML 中的 <p> 标记,出现在整个段落的两侧。
<text:span>对应于 HTML 中的 <span> 标记,允许我们为段落了某些特定的部分指定样式。
<text:alphabetical-index-mark>、

  <text:alphabetical-index-mark-start> 和

  <text:alphabetical-index-mark-end>

标识索引条目。

  简单的更改

  如果尚未作好准备工作,请先解压压缩文件中的 content.xml 文件并在喜好的文本编辑器中打开。然后就可以开始尝试这个简单的实验了,它会让您找到编辑的感觉。在文档接近结束的地方,您会发现如下这行代码:

<text:p text:style-name="Standard">Hello world!</text:p>

  将它改为如下内容:

<text:p text:style-name="Standard">Goodbye cruel world!</text:p>

  接着保存修改的文件。保存好之后,使用新副本更新压缩文件并将其扩展名重命名为 ODT。现在使用 OpenOffice.org 重新打开该文件。您会发现文件中除了有一处文本经过修改之外,其它地方都是与原文件一样的。

  如果一切运行无误,则可以直接跳到 下一节。然而,如果文档无法正确打开,那么您需要检查如下三个地方:

  1、确保没有破坏 XML 文件。

  如果您误删了一个结束标记,键入的标记名不正确或者多打了一个小于号 (<),则有可能遇到这种问题。这也许是编辑过程中最常见的问题,我们应当要保证原文件的安全可靠。

  2、确保是将 XML 文件作为纯文本保存的(即 8-bit Unicode Transformation Format [UTF-8] 格式)。

   如果使用的是简单文本编辑器,那么是不应该出现问题的。但是,如果您选择使用 OpenOffice.org(或者其他的富文本编辑器,比如说 Microsoft Office WordPad、Microsoft Office Word 或 WordPerfect),请确保所保存的文档格式没有保留其格式。如果确实如此,那么可以使用 Save as type > Text document 项来保存 XML 文件。

  3、确保没有修改压缩。

  我不知道最新版的 OpenOffice.org 中是否依然存在此问题,但是有时我以不同于原压缩文件的压缩等级重新压缩文件时会遇到此问题。这时,OpenOffice.org 就会不太确定如何解释该文件。如果此问题依然存在,可以通过更新已有压缩文件的方法(而不是创建一个新的压缩文件)来避免此问题。

  移除索引标记

  现在看看我之前提到的问题:如何移除多余的索引标记?清单 1 是一个示例 content.xml 文件,其中含有多处索引标记。

  清单 1. 含有索引标记的 Content.xml

<text:p text:style-name="P3">A lot of people would think that
you&apos;re out of your<text:alphabetical-index-mark
text:string-value="gourd" text:key1="mind" text:key2="noggin"/>
mind if you suggest such a thing. Some would say that the ubiquitous
<text:alphabetical-index-mark-start text:id="IMark100896128"/>Microsoft
<text:alphabetical-index-mark-end text:id="IMark100896128"/>
<text:alphabetical-index-mark-start text:id="IMark101662028"/>Office
<text:alphabetical-index-mark-end text:id="IMark101662028"/> is one of
the greatest examples of &quot;feature creep&quot; of any program,
with competitors like Corel and Open<text:alphabetical-index-mark-start
text:id="IMark101661388"/> Office<text:alphabetical-index-mark-end
text:id="IMark101661388"/>.org containing a comparable number of features.

   注意,此处有两种不同类型的索引标记。当 OpenOffice.org 把文档中的某个单词指定为标记时,会将 <text:alphabetical-index-mark-start> 和 <text:alphabetical-index-mark-end> 标记放在其两侧。指定给这两个标记的 text:id 属性是相同的,这样便可以识别它们是相互匹配的。

  如果索引中的单词没有出现在文本中,则会使用另外一种标记。如果多个关键字都与一个特 定的位置相关,那么也会使用这种标记。在本例中,gourd 就是以这种方式输入的。我们可以看到它包含在 <text:alphabetical-index-mark> 标记中间,并没有使用 -start 或 -end。

  这种方式使得移除索引的方法极其简单。要解决此问题,只需在搜索替换操作中使用一些通配符。许多工具都可以完成该操作,但我认为使用 OpenOffice.org 的正则表达式引擎是惟一合适的方法:

  在 OpenOffice.org 中打开 content.xml。

  打开 Find & Replace 对话框并打开 More Options 选项。

  选中 regular expressions 框。

  在搜索框中输入 <text:alphabetical-index-mark(-(start|end))? [^>]*/>。Replace with 输入框不填。

  单击 Replace all。

  以原文本格式保存并关闭文档。

  大功告成!ODT 文件中的这个文件完成替换后,我们会发现所有索引引用都从文档中移除了。这种方法允许我们使用 OpenOffice.org 的工具创建索引,而不会产生重复的标记或者包含无用的标记。

   值得花时间琢磨一下上面所使用的这个搜索替换功能。<text:alphabetical-index-mark(-(start|end))? [^>]*/> 是一个模式,它有效地表示了任何 text:alphabetical-index-mark、text:alphabetical-index-mark-start 或 text:alphabetical-index-mark-end tag 和它们的所有内容。也可以更简单的写为 <text:alphabetical-index-mark [^>]*/>,但是这样有可能会把其他一些类似命名的标记包括进来,如果有的话。

  注意,这一方法并不是万不一失的。比如 说,如果某个索引标记的文本中包含有大于号 (>),那么这个功能会认为标记已经结束,而不会移除整个标记。此类潜在的问题的存在使我们有理由作好备份。如果发生这种问题,可以逐个执行搜索替 换功能,这仍然是移除标记的最快捷的方法。除此之外,还可以编写一个更复杂正则表达式来解决这一问题。

  翻转电子表格数据

  此处是另一个常见任务的例子。我们需要将一行电子表格数据换个格式。比如说,我们要将如下内容:

1  2  3  4  5  6  7  8  9  10

  转换为如下内容:

1
2
3
4
5
6
7
8
9
10

  如果您编辑的是 XML,一个简单的搜索替代功能便可以完成数百个操作。与之前的操作一样,先解压文件,并打开 content.xml 文件。其中包含的内容应该如 清单 2 所示(为了提高可读性,我稍微修改了一下格式):

  清单 2. 电子表格中的 Content.xml

<office:body>
  <office:spreadsheet>
  <table:table table:name="Sheet1" table:style-name="ta1" table:print="false">
     <table:table-column table:style-name="co1"
   table:number-columns-repeated="10"
   table:default-cell-style-name="Default"/>
      <table:table-row table:style-name="ro1">
        <table:table-cell office:value-type="float" office:value="1">
         <text:p>1</text:p>
        </table:table-cell>
        <table:table-cell office:value-type="float" office:value="2">
         <text:p>2</text:p>
        </table:table-cell>
        <table:table-cell office:value-type="float" office:value="3">
          <text:p>3</text:p>
        </table:table-cell>

   翻转数据最简单的方法就是先结束每一行然后再描述下个单元。因此,在文本编辑器中搜索 </table:table-cell> 并替换为 </table:table-cell></table:table-row><table:table- row>。这样便会在每个单元后结束一行并开始一个新行。

  结束语

  本文介绍了几个示例直接编辑 ODF 文档。简单的文本编辑能提供一些简单的特性,而这些特性往往是公办套件所没有的。除此之外,掌握了通过编程语言操纵 XML 的知识,我们几乎可以无所不能,从自动大批量修改到创建新文档,不一而足。甚至还可以使用已有的文件作为模板并使用简单的 shell 脚本和工具生成含有 ODF 文本文件、电子表格等格式的报表。只有想不到,没有做不到!享受编辑的过程吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值