第3章:.docx本质 —— ZIP包结构
学习目标
- 理解.docx本质上是一个ZIP压缩包
- 学会手动解压.docx查看内部结构
- 了解.docx包内的主要文件和目录
- 理解关系文件(.rels)的作用
- 理解内容类型文件的作用
3.1 .docx就是一个ZIP文件
很多新手不知道:.docx文件本质上就是一个ZIP压缩包。
你可以直接验证这一点:
- 找一个.docx文件,复制一份
- 将扩展名从
.docx改成.zip - 用你的解压软件(7-Zip、WinRAR等)解压它
- 你会看到里面有很多文件和文件夹
这就是.docx的真相:它不是什么神秘的二进制格式,就是一堆XML文件和其他资源文件打包压缩在一个ZIP包里。
动手实践
练习:找一个你自己的Word文档,按照上面的步骤改后缀解压,看看里面有什么。这会帮助你建立直观认识。
3.2 .docx包内的文件结构
解压一个典型的.docx文件后,你会看到类似这样的结构:
├── _rels/
│ └── .rels
├── docProps/
│ ├── app.xml
│ └── core.xml
├── word/
│ ├── _rels/
│ │ └── document.xml.rels
│ ├── document.xml
│ ├── fontTable.xml
│ ├── footer1.xml
│ ├── header1.xml
│ ├── numbering.xml
│ ├── settings.xml
│ ├── styles.xml
│ ├── theme/
│ │ └── theme1.xml
│ └── media/
│ ├── image1.png
│ ├── image2.jpeg
│ └── ...
└── [Content_Types].xml
这就是一个标准的.docx结构。让我们逐层介绍每个部分是做什么的。
根目录文件
| 文件 | 作用 |
|---|---|
[Content_Types].xml | 定义包内每个部分的内容类型 |
_rels/.rels | 定义包级关系,找到主文档在哪里 |
docProps目录
docProps 存放文档属性:
| 文件 | 作用 |
|---|---|
core.xml | 核心属性:标题、作者、创建时间、修改时间等 |
app.xml | 应用属性:Word版本、页数、字数统计等 |
word目录(核心部分)
这是最重要的目录,文档主要内容都在这里:
| 文件 | 作用 |
|---|---|
document.xml | 主文档内容,正文文字和结构都在这里 |
styles.xml | 样式定义 |
numbering.xml | 编号列表定义 |
settings.xml | 文档设置 |
fontTable.xml | 字体表 |
headerN.xml | 页眉(多个页眉多个文件) |
footerN.xml | 页脚(多个页脚多个文件) |
theme/theme1.xml | 主题定义 |
media/ | 存放嵌入的图片等媒体文件 |
_rels/document.xml.rels | 文档内部关系,定义图片、页眉页脚等引用 |
3.3 关系文件(.rels)是什么
你已经看到包里有_rels/.rels和word/_rels/document.xml.rels这些文件。这些是关系文件(Relationships)。
关系的作用
Open XML使用关系来表示资源之间的引用关系。为什么不直接用文件路径?
关系的好处:
- 解耦:源文件不需要知道目标文件的具体路径
- 可移动:移动目标文件只需要更新关系文件,不需要更新所有引用
- 类型明确:关系可以指定类型,说明这是什么类型的引用
关系文件格式
关系文件的结构很简单,举个例子,_rels/.rels:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Id="rId1"
Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"
Target="word/document.xml"/>
<Relationship Id="rId2"
Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties"
Target="docProps/core.xml"/>
<Relationship Id="rId3"
Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/extended-properties"
Target="docProps/app.xml"/>
</Relationships>
每个<Relationship>元素表示一个关系:
Id:关系ID,在这个文件内唯一Type:关系类型,说明这是什么关系Target:目标文件的路径
从上面例子可以看出:
rId1指向word/document.xml,这就是主文档- 所以任何程序打开docx后,先读
_rels/.rels就能找到主文档在哪里
文档内关系
word/_rels/document.xml.rels是主文档的关系文件,用来引用图片、页眉、页脚等:
<Relationships xmlns="...">
<Relationship Id="rId1" Type="..." Target="header1.xml"/>
<Relationship Id="rId2" Type="..." Target="footer1.xml"/>
<Relationship Id="rId3" Type="..." Target="media/image1.png"/>
</Relationships>
在主文档document.xml中,通过r:id="rId1"来引用这些关系。我们后面看具体例子。
3.4 内容类型文件 [Content_Types].xml
根目录下的[Content_Types].xml定义了包内每个部分的内容类型。
为什么需要内容类型
ZIP包本身不知道里面每个文件是什么类型,所以需要一个文件来说明。
一个典型的[Content_Types].xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ContentTypes 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"/>
<Default Extension="png"
ContentType="image/png"/>
<Default Extension="jpeg"
ContentType="image/jpeg"/>
<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"/>
</ContentTypes>
两种声明方式
-
Default:默认,按扩展名定义内容类型。所有扩展名为png的都是image/png类型。
-
Override:覆盖,对特定路径的文件覆盖其内容类型。主要用于特殊的XML文件需要指定具体类型。
ContentType命名
Open XML的内容类型都遵循命名惯例:
application/vnd.openxmlformats-officedocument.[部分类型]+xml
例如:
- 主文档:
...wordprocessingml.document.main+xml - 样式:
...wordprocessingml.styles+xml
3.5 文档属性在哪里
文档属性(作者、标题、时间等)存放在docProps目录下。
core.xml 核心属性
docProps/core.xml包含Dublin Core核心元数据:
<cp:coreProperties xmlns:cp="..." xmlns:dc="...">
<dc:title>我的文档标题</dc:title>
<dc:creator>张三</dc:creator>
<cp:lastModifiedBy>张三</cp:lastModifiedBy>
<dcterms:created>2024-01-01T12:00:00Z</dcterms:created>
<dcterms:modified>2024-01-02T15:30:00Z</dcterms:modified>
</cp:coreProperties>
常见属性:
dc:title:文档标题dc:creator:创建者/作者cp:lastModifiedBy:最后修改者dcterms:created:创建时间dcterms:modified:最后修改时间
app.xml 扩展属性
docProps/app.xml包含应用程序特定属性:
<Properties xmlns="...">
<Application>Microsoft Office Word</Application>
<AppVersion>16.0000</AppVersion>
<Pages>10</Pages>
<Words>12345</Words>
<Paragraphs>123</Paragraphs>
</Properties>
包含:
- 使用的应用程序和版本
- 页数、字数、段落数统计
- 文档安全性等信息
3.6 动手解压看看真实结构
理论说了这么多,现在动手实践一下:
- 准备一个简单的docx文件:创建一个新Word文档,输入几行文字,插入一张图片,保存。
- 复制一份,不要改坏原文件。
- 改扩展名:把
.docx改成.zip。 - 解压:用解压软件解压。
- 浏览:看看各个文件,用文本编辑器打开XML文件看看内容。
你会看到:
- XML都是文本,可读性很好
- 结构和我们讲的一样
- 你的文字在
word/document.xml里 - 图片在
word/media/里
这个练习非常重要,亲手看过一次胜过读十遍书。
本章小结
- .docx本质上就是一个ZIP压缩包,改后缀就能解压查看
- ZIp包内包含多个XML文件和资源文件
_rels/.rels是入口,从中可以找到主文档位置[Content_Types].xml定义各文件的内容类型docProps/存放文档属性(作者、时间等)word/document.xml是主文档,存放正文内容word/styles.xml存放样式定义- 图片等媒体放在
word/media/目录
下一章我们介绍Open XML标准和ECMA-376。