1. 程式人生 > >Walkthrough: Word 2007 XML 格式

Walkthrough: Word 2007 XML 格式

本頁內容

簡介

Microsoft Office Word 2007提供了一種新的預設檔案格式,叫做Microsoft Office Word XML格式(Word XML格式)。這種格式基於開放打包約定(Open Packaging Conventions)XML Paper Specification (XPS)也是基於這個約定。Microsoft Office 97到Microsoft Office 2003中使用的二進位制檔案格式仍然可以作為一種儲存格式來使用,但是它不是儲存新文件時的預設文件。

在1999年釋出的,Microsoft通過Microsoft Office Excel 2002中的SpreadsheetML,將XML引入了Microsoft Office XP當中。SpreadsheetML是一個良好的開始,但是它沒有提供完全真實的功能。在下一個版本的Microsoft Office產品中,Microsoft Office Word 2003引入了WordprocessingML。WordprocessingML是非常重要的一步,因為它是Microsoft Office提供的第一個完全真實的XML檔案格式。通過Microsoft Office 2003,您可以解析WordprocessingML檔案,向其中新增、更新或處理資料。但是,仍然存在著一些限制。例如,您必須將二進位制檔案(例如圖片)編碼為XML檔案中的文字,如果檔案中包含大量圖片的話,這必然會增加檔案的尺寸。另外,Word 2003直接將所有自定義XML資料嵌入到描述文件的WordprocessingML當中。這樣使得自定義XML難於訪問和處理所有的外部過程。

Word 2007中新的檔案格式將檔案分成一些文件部件,其中每個部件定義了檔案的部分內容,這樣就解決這些問題。當您希望更改檔案當中的一些內容的時候,您可以簡單的查詢您希望更改的文件部件,例如頁首,然後無需影響其它基於XML的文件部件,就可以編輯它。類似的,所有的自定義XML資料都有它自己的部件。現在,處理自定義的XML就更加簡單的。這允許您使用很少的程式碼來生成文件。新的檔案格式更加的強大,並且可以更為簡單地處理自定義XML,而且它比二進位制檔案格式要更小。新的檔案格式使用開放打包約定,利用ZIP技術。本篇文章將瀏覽Word 2007文件中這種新檔案格式的結構。

返回頁首返回頁首

Word 2007 文件包

Word 2007中的檔案格式由一個壓縮的ZIP包組成,稱為包。這個包中包含了文件中的所有內容。通過這種包格式,可以減少Office文件檔案的容量,因為它是使用ZIP壓縮的。新的格式也更加的穩定,而避免了傳輸或處理中可能出現的錯誤。它允許您使用工業標準的ZIP工具,來處理文件的內容。最為簡單的檢視這咱新檔案格式的方法是,將一個Word 2007文件儲存為這種新的預設格式,然後將這個檔案重新命名為.zip副檔名。雙擊檔案,開啟並檢視它的內容。

注意 為了理解基於Microsoft Office Open XML格式(Office XML格式)的組成,您可以將它的所有部件提取出來。要開啟這個檔案,您需要在您的計算機中安裝一個ZIP工具,例如WinZip。您可以通過以下步驟在Word 2007中開啟一個Word XML格式:

1.

建立一個臨時目錄來儲存檔案和它的部件。

2.

建立一個Word 2007文件,包括文字,圖片,以及其它元素,儲存為一個.docx檔案。

3.

在檔名的末端新增一個.zip副檔名。

4.

雙擊檔案。這時將會在ZIP應用程式當中開啟該檔案。您可以檢視組成檔案的每個部件。

5.

將這些部件提取到剛才建立的臨時目錄當中。

6.

整合的ZIP壓縮可以將檔案的尺寸減少百分之75。檔案最終被分成一些模組化的檔案結構,它使得資料的恢復更為可行,並且增強了安全性。新的格式將檔案分成了不同的元件,從而可以獨立的管理和修復。以新格式建立的檔案也根據不同的檔案型別,擁有一些特殊的副檔名。

1. Word 2007 檔案型別的副檔名

Word 2007 檔案型別 副檔名

Word 2007 XML 文件

.docx

Word 2007 XML 啟用巨集的文件

.docm

Word 2007 XML 模板

.dotx

Word 2007 XML 啟用巨集的模板

.dotm

返回頁首返回頁首

Word XML格式的開放打包約定

開放打包約定指定了Word 2007文件中新檔案格式的結構。有關開放打包約定的更多資訊,請檢視開放打包約定XML Paper Specification 也使用這個約定。

為了理解一個Word 2007文件的結構,您必須理解這種新檔案格式中的三個主要元件:

1.

部件項。每個部件項都對應於包解壓後的一個檔案。例如,如果您右擊一個Microsoft Office Excel工作簿,然後選擇提取它,您將會看到一個workbook.xml檔案,一些 sheetn.xml檔案,和其它的一些檔案。這些檔案都是包中的文件部件。

2.

內容型別項。內容型別項描述了一個文件部件儲存了什麼型別的檔案。例如,image/jpeg表示了一個JPEG圖片。這種資訊允許Microsoft Office,和第三方工具,來決定包中任意部件的內容,並處理它的內容。

3.

關係項。關係項指定文件部件的集合如何組合為一個文件。這種方法指定了一個源部件和一個目標部件之間的連線。關係在文件包中儲存為XML部件,例如/_rels/.rels。

下面的章節解釋了這些元件如何組成一個Office XML格式的檔案。

Word 2007 文件部件

為了便於使用第三方的過程和工具來組建和裝配Word 2007文件,Word將包的內容分成許多邏輯部件,每個部件儲存了一個特定的文件部分,例如:

1.

註釋

2.

格式定義

3.

列表定義

4.

頁首

5.

圖表

6.

關係圖

7.

文件內容

8.

圖片

在包中,Word使用單獨的檔案來表示文件中的每個部分。這些部件可以由XML檔案組成,例如包含標記的Word XML格式的文件部件,以及附加的內容,例如二進位制的圖片或嵌入的OLE檔案。所有的這些都包含在包中。但是,更為重要的是,通過開放打包約定定義的一些例外,實際的檔案目錄結構是任意的。

包中檔案的關係,而不是檔案結構,決定了檔案的有效性。您可以重新排布和命名ZIP容器當中的部件,只要保證正確的更新關係,並且保證文件部件之間正確的關聯就可以。如果關係是正確的,那麼就可以無誤的開啟文件。Word 2007文件的初始檔案結構只是Word建立的預設結構,它使得您可以輕鬆的定位檔案的組成。只要您正確的保持了關係,那麼您可以更改這種檔案結構。

例如,在Word 2007中,容器檔案代表了一個文件。在容器檔案中,按序排布的部件組成了文件。例如,一個Word 2007檔案可能會(但不僅限於)包含一步下列目錄和檔案:

1.

[Content_Types].xml。 描述出現在檔案中的每個內容型別。

2.

rels folder。 儲存所有指定部件的關係部件。

3.

rels file。 描述了文件結構中的起始關係。它稱為關係部件。

4.

datastore folder。 包含了文件中的自定義XML資料部件。自定義XML資料部件是一個XML檔案,您可以將節點繫結到文件的內容控制元件中。

5.

item1.xml file。 包含了一些文件中出現的資料。例如自定義XML資料部件。

6.

docProps folder。 包含了應用程式的屬性部件。

7.

App.xml file。 包含了應用程式特定的屬性。

8.

Core.xml file。 包含了所有基於開放打包約定文件格式的通用檔案屬性。

圖 1 顯示了一個示例Word 2007文件的檔案結構。

.

1. 一個典型Word 2007 文件的層次化檔案結構

您可以替換整個文件部件,從而更改Word 2007文件的內容、屬性、或格式。

Word 2007 內容型別

上面提到過,每個文件部件都有一個特定的內容型別。一個部件的內容型別描述了這種檔案型別的內容。例如,XML部件包含了Word XML格式定義的標記,而內容型別可以幫助您分析它的組成。

典型的內容型別是以word application開頭,然後是廠商的名稱。在內容型別中,word vender 被簡寫為vnd。所有內容型別都被指定為以application/vnd.ms-word開頭。如果內容型別是一個XML檔案,那麼它的URI將以+xml結尾。其它的非XML內容的型別,例如圖片,則沒有這種結尾。下面是一些典型的內容型別:

1.

application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml

它是一個描述Word文件中的尾註文件部件的內容型別。其中,+xml表示它是一個XML檔案。

2.

application/vnd.openxmlformats-package.core-properties+xml

它是一個描述核心文件屬性部件的內容型別。其中,+xml表示它是一個XML檔案。

3.

image/png

圖片的內容型別。其中沒有+xml部分 - 表示內容型別不是XML檔案。

您可以使用所有的這些內容型別,來處理一個Word 2007檔案的內容。Microsoft Windows Software Development Kit (SDK) for Beta 2 of Windows Vista and WinFX Runtime Components包含了System.IO.Packaging名稱空間,它允許您新增文件部件、獲取和更新內容,或者建立關係。例如,使用Microsoft WinFX System.IO.Packaging類,您可以使用PackagePart.CreatePart方法建立一個文件部件。CreatePart方法需要兩個字串引數;一個是新部件的URI,另一個是部件的內容型別,如下所示:

PackagePart packageNewPart = package.CreatePart(uriResourceTarget, "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml");

這個程式碼示例使用儲存在uriResourceTarget變數中的URI和表示格式的內容型別,建立了一個文件部件。有關PackageParts的更多資訊,請檢視Microsoft Windows SDK中的 PackagePart Class引用文件。

定位內容型別

下面的章節包含了一個內容型別中出現最為頻繁的列表。Word 2007在包中通過一個檔案或部件描述每個內容型別。在包根目錄下的[Content_Types].xml檔案,列出了文件中的每個部件,以及它的ContentType物件。例如,您可能會看到如下的內容:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
    <Override PartName="/word/footnotes.xml" ContentType= "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml"/>
    <Default Extension="png" ContentType="image/png"/>
    <Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
    <Default Extension="xml" ContentType="application/xml"/>
    <Override PartName="/word/document.xml" ContentType= "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/>
    <Override PartName="/word/numbering.xml" ContentType= "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml"/>
    <Override PartName="/word/styles.xml" ContentType= "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"/>
    <Override PartName="/word/endnotes.xml" ContentType= "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml"/>
    <Override PartName="/docProps/app.xml" ContentType= "application/vnd.openxmlformats-officedocument.extended-properties+xml"/>
    <Override PartName="/word/settings.xml" ContentType= "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml"/>
    <Override PartName="/word/footer2.xml" ContentType= "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml"/>
    <Override PartName="/docProps/custom.xml" ContentType= "application/vnd.openxmlformats-officedocument.custom-properties+xml"/>
    <Override PartName="/word/footer1.xml" ContentType= "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml"/>
    <Override PartName="/word/theme/theme1.xml" ContentType= "application/vnd.openxmlformats-officedocument.theme+xml"/>
    <Override PartName= "/word/fontTable.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml"/>
    <Override PartName= "/word/webSettings.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml"/>
    <Override PartName="/word/header1.xml" ContentType= "application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml"/>
    <Override PartName="/docProps/core.xml" ContentType= "application/vnd.openxmlformats-package.core-properties+xml"/>
</Types>

您可以在目錄結構中重新命名或重新排布所有這些部件。列出的這些部件都在它們預設的位置,並且擁有預設的名稱,從而可以輕鬆的判斷出它們是什麼檔案。

在包根目錄下的Word目錄中,包含了描述文件的最為主要的資訊。在這個目錄中,您可能會發現一些表示可用內容型別的部件。

將文件部件匹配到內容型別

檔案格式中每個XML檔案都是一個文件部件。如果您詳細的檢視這種新格式的檔案,您會發現一些目錄結構,或文件部件,例如/word/fontTable.xml和word/styles.xml。這些檔案的名稱清楚的表示了它們的目的(例如,字體表和格式部件)。但是,您也可以更改它們的名稱。因為在[ContentTypes].xml檔案中的<Types>元素匹配了每種內容部件,它們表示不同的內容型別。[ContentTypes].xml可能由下列程式碼組成:

<Override PartName="/word/styles.xml" ContentType= "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"/><Override PartName= "/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml"/>

其中,/word/styles.xml文件部件擁有/vnd.openxmlformats-package.core-properties+xml內容型別。/docProps/core.xml部件擁有application/vnd.openxmlformats-package.core-properties+xml內容型別。

文件部件間的關係

關係是包中更為重要的部件之一,因為它們記錄了文件部件之間的連線。您可以在包的目錄結構中重新命名或移動部件,但是必須通過關係正確的保持檔案的有效性。

關係表示了檔案包中兩個部件的邏輯連線。例如,根文件部件擁有一個http://schemas.openxmlformats.org/package/2006/relationships/header型別到application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml內容型別部件的關係。這表示部件之間的關係是,目標部件是源部件的頁首。另外,該內容部件表示這是內容是一個Word 2007頁首。這個頁首部件可能也會擁有它自己的關係。例如,如果頁首中包含一個JPEG圖片,那麼頁首可能會一個從http://schemas.openxmlformats.org/officeDocument/2006/relationships/image到image/jpeg內容型別的關係。

在包中,關係通過可以在一個叫做_rels的目錄中進行定位。為了查詢從任意部件生成的關係,請查詢_rels目錄。如果這個部件擁有一些關係,那麼_rels目錄中將會包含一個檔案,它是您的源部件的名稱加.rels副檔名。例如,假設您希望查詢officeDocument部件是否擁有關係,其中可能會擁有一個http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument內容型別。預設地,這個部件會擁有一個/word/document.xml的URI,因為您可以開啟包中的/word/_rels目錄,所有查詢一個叫做document.xml.rels的檔案。

每個關係都擁有一個源和一個目標。源是關係命名的部件。例如,document.xml.rels中所有的關係都將document.xml作為它們的源。每個.rels檔案都包含一個<relationships>元素,其中您可以為每個目標關係找到一個對應的<relationship>元素,其中包含目標關係的id,這就是目標部件,並且會包含目標部件的內容型別。下面是document.xml.rels檔案中一個典型的<relationships>元素:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
    <Relationship Id="rId3" Type= "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target= "docProps/app.xml"/>
    <Relationship Id="rId2" Type= "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target= "docProps/core.xml"/>
    <Relationship Id="rId1" Type= "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target= "word/document.xml"/>
    <Relationship Id="rId4" Type= "http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties" Target= "docProps/custom.xml"/>
</Relationships> 

注意,每個relationship元素首先指定了關係的id,然後是目標的內容型別,最後是目標文件部件。

返回頁首返回頁首

解析Word 2007檔案

這個章節將帶您瀏覽一個Word 2007新檔案格式的檔案中主要的文件部件。它還列出了這些部件之間的關係,並使用預設的目錄結構來展示。

理解根級別的關係

所有使用Word XML格式的檔案的第一個部件都一個virtual文件部件,或者是包本身,這稱為起始部件。在這個起始部件中,包含了許多到頂級部件的關係,它描述了文件的內容:

2. 根級別的部件,關係和內容型別

部件名稱 關係型別 內容型別 可選?

核心文件屬性(在開放打包約定中定義的)

http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties

application/vnd.openxmlformats-package.core-properties+xml

特定應用程式的文件屬性

http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties

application/vnd.openxmlformats-officedocument.extended-properties +xm

自定義的OLE文件屬性

http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties

application/vnd.openxmlformats-officedocument.custom-properties +xml

主要的文件部件

http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument

application/vnd.openxmlformats-officedocument.wordprocessingml.main+xml

這四個預設的部件包含了主要的文件屬性,也是到文件根部件的引用,這是主要的文件內容。

理解文件級別的關係

在主文件部件中,有一系列由主文件引用的文件部件的關係,如表3所示。

注意,下面大多數關係都擁有下面的字首:

http://schemas.openxmlformats.org/officeDocument/2006/relationships/

3. 文件級別的部件,關係和內容型別

部件名稱 關係型別 內容型別 可選?

樣式定義

/styles

application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml

列表定義

/lists

application/vnd.openxmlformats-officedocument.wordprocessingml.listDefs+xml

文件設定

/settings

application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml

頁首

/header

application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml

頁尾

/footer

application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml

腳註

/footnotes

application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml

尾註

/endnotes

application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml

圖片

/image

image/[image extension], such as image/png or image/jpeg

註釋

/comments

application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml

字體表

/fontTable

application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml

自定義XML項

/customXML

application/xml

Web設定

/webSettings

application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml

這個部件列表不是非常完整。例如,它不包括共享的部件,例如OLE物件,Microsoft ActiveX控制元件,和數字簽名。但是,它為我們展示了一個典型Word 2007中Word XML格式的結構。

確定包URI 和內容型別名稱

像上面所描述的那樣,您可以使用一個URI引用所有的關係,和幾乎所有的文件部件。一共有兩種型別的URI:一個是文件部件,另一個是關係。

在新的Word XML 格式中,URI關係通常由下列標記開始:

http://schemas.openxmlformats.org/officeDocument/2006/relationships/

例如,應用程式級別屬性使用的關係型別如下:

http://schemas.openxmlformats.org/officeDocument/2006/relationships/ /extended-properties

這個URI包換了officeDocument,因為Office XML檔案格式暗示了這些關係。

以http://schemas.openxmlformats.org/package/2006/relationships/開頭的關係型別是例外。注意,它使用package而不是officeDocument,表示它遵循XPS Open Packaging Convention。這樣的關係型別使用如下的URI字首:

http://schemas.openxmlformats.org/package/2006/relationships/ metadata/core-properties

URI描述了特定於檔案的屬性。關係URI是預先定義的。您不能修改它們。

文件部件的URI指向包中的文件部件。例如,包含文件主要資訊的文件部件的預設URI是/word/document.xml。也就是說,主要的文件資訊包含在一個叫做document.xml的檔案中,它位於包中根目錄下的word目錄中。佻可以重新命名包中的文件部件,從而更改文件部件的URI。非常重要的是,要在重新命名或重新放置包中的文件部件時更新它們的關係。

返回頁首返回頁首

確定Word 2007文件中的非XML部件

Word 2007文件中所有嵌入的部件都是預設的Word XML格式。因此,如果您向文件中添加了一幅圖片,那麼您可以將文件重新命名為.zip的副檔名,然後使用ZIP檔案開啟它。在包中,您可以定點陣圖片,然後開啟它。如果圖片是.png格式的,那麼您可以直接從包中檢視並開啟.png檔案。

類似的,如果您將一個Microsoft Office Visio文件嵌入到一個Word 2007文件中,那麼您可以在包中定位到一個.bin檔案。

這為開發人員創造了很多機會,來開放關於文件的解決方案。考慮一個場景,一個公司擁有成百上千份文件,它們都擁有相同的公司logo圖片。如果需要更換公司的logo,那麼您可以通過一個簡單的指令碼,來為每個文件使用新的logo替換原有的logo。

包中預設的圖片位置是/word/media目錄,而包中嵌入物件的預設位置是/word/embeddings。

圖2顯示了一個包含圖片與嵌入物件的文件的目錄結構。

.

2. 一個包含圖片和嵌入物件的Word 2007文件的層次化檔案結構

返回頁首返回頁首

從文件中分離內容

匹配到內容型別的文件部件由下列URI指定:

application/vnd.openxmlformats-officedocument.wordprocessingml.main+xml

它定義了大部分文件結構。在啟用巨集的檔案中,這個部件匹配到application/vnd.ms-word.template.macroEnabledTemplate.main+xml,它定義了大部分文件結構。在前面[Content-Types].xml檔案的程式碼示例中,內容型別匹配到/word/document.xml目錄中的document.xml部件。

這個部件包含的XML與Word 2003中使用的WordprocessingML子集是相似的。還有一些圖表、屬性和字型的元素,它們描述了文件的基本結構。單獨的部件描述了文件的所有元件,例如頁首,頁尾,列表和尾註。預設地,大多數這些部件都是下面內容型別檔案的後繼:

application/vnd.openxmlformats-officedocument.wordprocessingml.main+xml

如果您仔細的檢視上面的[Content-Types].xml程式碼示例,您會發現裡面列出了許多這樣的部件。

將內容與格式的分離,使得我們可以比以前的版本更為簡單地程式化處理一個文件的元素。使用WinFX System.IO.Packaging型別,您可以通過幾行程式碼來修改檔案,並且執行下面的任務:

1.

使用一個新的logo替換成百上千的文件中使用的舊logo。簡單的定點陣圖片,刪除它,然後使用新圖片替換它。

2.

更新伺服器上所有文件中的頁尾,從而更新公司名稱。

3.

更改伺服器上所有文件中的文字樣式,從而使用一種新的公司字型。

當然,還可以建立更多的解決方案。通過這種內容的分離,定位部件進行編輯就要比Word 2003中的WordprocessingML更加簡單。在WordprocessingML檔案中,整個文件被描述在一個巨大的XML檔案當中。解析這個檔案並且修改它是非常困難的。而且還是非常冒險的,因為如果出現了一個錯誤,那麼將會損壞整個文件。相反,如果一個Word 2007文件中的一部分發生了損壞,那麼文件剩餘的部件還可以無誤的開啟。

返回頁首返回頁首

理解資料儲存

與許多Word XML格式中其它的資料型別相似,自定義XML資料也是單獨的儲存在文件當中的。每個項都儲存為包中的一個單獨的部件,這個資料出現以一個叫做customXML的目錄中,它位於包的根目錄下。如果您使用程式通過將一個新的部件新增到文件的customXMLParts集合,將一個XML檔案附加到一個文件當中,然後預設地XML資料被儲存在一個叫做/customXml/item1.xml的檔案當中。如果您又從另外一個檔案添加了一個自定義XML資料,那麼預設情況下,它會被儲存到叫做/customXml/item2.xml的檔案當中。

通過使用XMLMapping和XPath表示式,您可以將XML部件的特定元素對映到一個內容控制。也就是說如果使用程式來修改自定義XML,您無需像Word 2003那樣去解析整個WordprocessingML檔案。而只需要查詢儲存自定義XML的部件,然後只修改這些檔案的內容。

要向您的文件中新增自定義資料,您需要建立一個自定義XML檔案,然後將它新增到ZIP包中。您還需要建立相應的關係,從主文件部件指向您的自定義XML部件。

在Word 2007的Word XML格式當中,每個自定義部件都表示文件容器中它自己的XML部件。這個自定義部件包含了檔名和它的關係資訊。XML是儲存在文件根目錄下的一個叫作customXml的目錄當中的。

圖 3 顯示了一個包含自定義XML資料文件的目錄結構。

.

3. 包含自定義XML資料的Word 2007文件的層次化檔案結構

文件包中獨立的自定義XML資料,允許您無需處理其它的文件部件,便可以讀取和更新自定義資料。

_rels目錄中儲存的關係檔案,描述了Word XML格式的文件中,從一個XML部件到其它XML部件之間的關係。有兩種自定義XML部件的關係型別。

XML的關係型別是:

http://schemas.openxmlformats.org/officedocument/2006/relationships/customXmlData

XML屬性的關係型別是:

http://schemas.openxmlformats.org/officedocument/2006/relationships/customXmlProps

每個關係都有一個ID,您可以使得它來定位不同的資料儲存。

實現的自定義XML部件是儲存在_rels目錄並列的檔案當中。每個自定義XML部件都擁有一個叫作item##.xml的檔名,並且擁有它自己的屬性,叫做itemProps##.xml。在兩個檔名中,##是資料儲存中自定義XML部件的編號(1,2,3…)。Item##.xml自定義XML部件的檔案格式如下所示:

<o:dataStoreItem>
<o:dataStoreItem o:itemID="MSXID for the custom XML part"/>
<o:xmlSchemaRef o:relID="relationship ID to a schema"/>
</o: dataStoreItem>

Walkthrough:建立一個Word XML格式檔案

Document.xml是Word XML格式中唯一需要的部件。有關更多如何建立一個最小化文件的資訊,請檢視建立文件小節。

為了解釋文件部件、內容型別項和關係項如何協同工作,這個章節將在Word 2007中構建一個更為複雜的Word XML格式文件。這個教程幫助您理解如何使用Word XML格式訪問和修改文件內容。

要建立一個包含內容型別和關係項的Word 2007文件,您需要建立一個根目錄,它包含一個特定的目錄和檔案結構,如圖4所示。

.

4. Word 2007文件的目錄和檔案結構

在您建立完所有的目錄和檔案後,下個小節將帶您向每個文件部件新增所需的XML程式碼。

建立文件屬性

首先,您需要為文件屬性建立兩個XML檔案:

1.

建立一個叫作root的目錄。

2.

在root目錄中建立一個叫作docProps的目錄。

3.

開啟記事本或其它的XML編輯器。

4.

將下面的程式碼複製貼上到一個新的檔案,並將它儲存為app.xml,並儲存在docProps目錄中:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Properties xmlns= "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" 
xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes">
    <Template>Normal.dotm</Template>
    <TotalTime>1</TotalTime>
    <Pages>1</Pages>
    <Words>3</Words>
    <Characters>23</Characters>
    <Application>Microsoft Office Word</Application>
    <DocSecurity>0</DocSecurity>
    <Lines>1</Lines>
    <Paragraphs>1</Paragraphs>
    <ScaleCrop>false</ScaleCrop>
    <Company>MS</Company>
    <LinksUpToDate>false</LinksUpToDate>
    <CharactersWithSpaces>25</CharactersWithSpaces>
    <SharedDoc>false</SharedDoc>
    <HyperlinksChanged>false</HyperlinksChanged>
    <AppVersion>12.0000</AppVersion>
</Properties>

5.

開啟記事本或其它XML編輯器。

6.

將下面的程式碼複製貼上到一個新的檔案,並將它儲存為core.xml,並儲存在docProps目錄中:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cp:coreProperties xmlns:cp= "http://schemas.openxmlformats.org/package/2006/metadata/core-properties" 
xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" 
xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance">
    <dc:title></dc:title>
    <dc:subject></dc:subject>
    <dc:creator>Your name</dc:creator>
    <cp:keywords></cp:keywords>
    <dc:description></dc:description>
    <cp:lastModifiedBy>Your name</cp:lastModifiedBy>
    <cp:revision>2</cp:revision>
    <dcterms:created xsi:type="dcterms:W3CDTF">2006-05-03T01:13:00Z</dcterms:created>
    <dcterms:modified xsi:type="dcterms:W3CDTF">2006-05-03T01:14:00Z</dcterms:modified>
</cp:coreProperties> 

建立文件

接下來,您需要為文件部件建立一個XML檔案。這個部件是新Word XML格式中唯一需要的部件。

1.

建立一個叫作root的目錄。

2.

在root目錄中建立一個叫作word的目錄。

3.

開啟記事本或其它的XML編輯器。

4.

將下面的程式碼複製貼上到一個新的檔案,並將它儲存為document.xml,並儲存在word目錄中:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:o="urn:schemas-microsoft-com:office:office" 
xmlns:o12="http://schemas.microsoft.com/office/2004/7/core" 
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" 
xmlns:m="http://schemas.microsoft.com/office/omml/2004/12/core" 
xmlns:v="urn:schemas-microsoft-com:vml" 
xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/3/wordprocessingDrawing" 
xmlns:w10="urn:schemas-microsoft-com:office:word" 
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/3/main">
    <w:body>
        <w:p>
            <w:r w:rsidR="002847EC">
                <w:t>Word 2007 rocks my world!</w:t> 
            </w:r>
        </w:p>
    </w:body>
</w:document>

建立一個關係

接下來,您需要為這個部件建立一個關係。這個關係被記錄在_rels目錄當中,也就是說這個關係是在包的根目錄之外。要建立關係:

1.

在root目錄中建立一個叫作_rels的目錄。

2.

開啟記事本或其它的XML編輯器。

3.

將下面的程式碼複製貼上到一個新的檔案,並將它儲存為.rels,並儲存在_rels目錄中:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
    <Relationship Id="rId3" Type= "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/>
    <Relationship Id="rId2" Type= "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/>
    <Relationship Id="rId1" Type= "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/>
</Relationships>

4.

注意,這個XML建立一個ID為rID1的officeDocument型別到一個叫做word的目錄中的document.xml檔案的關係。

定義內容型別

下一步,您需要定義這個檔案的內容型別。

1.

注意,內容型別定義檔案的結構如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
    <Default Extension="rels" ContentType= "application/vnd.openxmlformats-package.relationships+xml"/>
    <Default Extension="xml" ContentType="application/xml"/>
    <Override PartName="/word/document.xml" ContentType= "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/>
    <Override PartName="/word/styles.xml" ContentType= "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"/>
    <Override PartName="/docProps/app.xml" ContentType= "application/vnd.openxmlformats-officedocument.extended-properties+xml"/>
    <Override PartName="/word/settings.xml" ContentType= "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml"/>
    <Override PartName="/word/theme/theme1.xml" ContentType= "application/vnd.openxmlformats-officedocument.theme+xml"/>
    <Override PartName="/word/fontTable.xml" ContentType= "application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml"/>
    <Override PartName="/word/webSettings.xml" ContentType= "application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml"/>
    <Override PartName="/docProps/core.xml" ContentType= "application/vnd.openxmlformats-package.core-properties+xml"/>
</Types>

2.

開啟記事本或其它XML編輯器。

3.

將上面的程式碼複製貼上到一個新的檔案,並將它儲存為[Content_Types].xml,並儲存在root目錄中:

注意 保留的檔名是由開放打包約定來使用的,它定義了包中所有檔案的內容型別。

建立包

最後,您可以將這些檔案放到一個ZIP包中,從而建立一個有效的Word 2007文件:

1.

使用任何ZIP工具,將simpledocument目錄中所有的內容儲存到一個ZIP文件,包括下面的子目錄:docProps目錄,word目錄,和_rels目錄。也包括[Content_Types].xml。

重點注意 不要簡單的將simpledocument目錄新增到一個ZIP檔案,否則在Word 2007中開啟檔案時可能會收到一個內部錯誤。您特別需要將simpledocument目錄所有的子目錄新增到ZIP包中。

2.

將這個包儲存為simpledocument.docx。

現在,您可以在Word 2007中開啟這個檔案,然後檢視包的內容:

.

5. Simpledocument.docx Word 2007中的顯示

返回頁首返回頁首

結論

與以前的Word版本中儲存的二進位制檔案格式相比,Word 2007中新的Word XML格式擁有許多優勢。ZIP包所帶來的檔案尺寸要更加小。檔案也更加穩定 - 如果檔案中的一部分損壞,那麼您仍舊可以開啟其它的文件元素,即使一部分已經損壞。

另外,也非常便於使用程式或手動地修改、新增或者刪除資料。這種檔案可以使用Microsoft WinFX System.IO.Packaging類來訪問。您只需編寫幾行程式碼,便可以修改伺服器上的檔案。您可以從它自己單獨的部件中訪問和處理自定義XML資料。您也可以使用事件來觸發XML資料的更改。例如,佻可以將一個內容控制元件匹配到一個包含股票配額的XML元素,然後在開啟文件時自動的獲取最新的配額資訊,從而確保使用者可以看到當前的價格。

這種可行性和易用性,使得您可以程式設計新的Word XML格式,並且充分利用Microsoft Office的巨大優勢。