DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> 處理 OpenOffice.org 基於 XML 的文檔格式
處理 OpenOffice.org 基於 XML 的文檔格式
編輯: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 文本文檔文件

File Description content.XML 包含所有的文檔文本以及索引標記、樣式信息的鏈接等等。該文件是文檔的主體。 meta.XML 包含文件元數據,比如說作者和文檔標題。 styles.XML 定義文本的格式,比如字體的更改、段落方向、頁面樣式等等。如果您對 Web 設計比較熟悉,那麼您就知道 styles.XML 功能等同於 CSS 樣式表。ODF 會盡可能地保持樣式與內容分離,因此 content.XML 文件中不會混入任何此類信息的說明。最多是含有一些從內容到樣式的鏈接。 Thumbnails/thumbnail.png 提供文檔第一個頁面的縮略圖。

  掌握 XML

  正如一些設計相當良好的 XML 格式,文檔文件並不是特別難於理解。XML 標記所使用的名字往往不言自明,因此我們可以大致猜出它們的意思。(當然,如果您不樂於猜測,那麼可以閱讀 ODF 文檔。請參閱 參考資料 獲得更多信息。)表 2 提供了一些示例。

  表 2. XML 標記

Tag Description <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 文本文件、電子表格等格式的報表。只有想不到,沒有做不到!享受編輯的過程吧!

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved