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 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的巨大優勢。