本页内容
简介 | |
Word 2007 文档包 | |
Word XML格式的开放打包约定 | |
解析Word 2007文件 | |
确定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"?> |
5. |
打开记事本或其它XML编辑器。 |
6. |
将下面的代码复制粘贴到一个新的文件,并将它保存为core.xml,并保存在docProps目录中: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
创建文档
接下来,您需要为文档部件创建一个XML文件。这个部件是新Word XML格式中唯一需要的部件。
1. |
创建一个叫作root的目录。 |
2. |
在root目录中创建一个叫作word的目录。 |
3. |
打开记事本或其它的XML编辑器。 |
4. |
将下面的代码复制粘贴到一个新的文件,并将它保存为document.xml,并保存在word目录中: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
创建一个关系
接下来,您需要为这个部件创建一个关系。这个关系被记录在_rels目录当中,也就是说这个关系是在包的根目录之外。要创建关系:
1. |
在root目录中创建一个叫作_rels的目录。 |
2. |
打开记事本或其它的XML编辑器。 |
3. |
将下面的代码复制粘贴到一个新的文件,并将它保存为.rels,并保存在_rels目录中: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
4. |
注意,这个XML创建一个ID为rID1的officeDocument类型到一个叫做word的目录中的document.xml文件的关系。 |
定义内容类型
下一步,您需要定义这个文件的内容类型。
1. |
注意,内容类型定义文件的结构如下所示: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
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的巨大优势。