第6章:主文档结构(document.xml)
学习目标
- 深入理解document.xml的完整结构
- 理解body的内容模型
- 掌握块级元素的种类
- 理解删除标记和批注的存储方式
6.1 document.xml 根结构
我们已经看过基本结构,现在来看完整的根结构:
<?xml version="1.0" encoding="UTF-8"?>
<w:document
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
<w:background w:val="FFFFFF"/>
<w:body>
<!-- 这里是主要内容:段落、表格... -->
<w:p>...</w:p>
<w:tbl>...</w:tbl>
<!-- 节属性 -->
<w:sectPr>
<w:pgSz w:w="12240" w:h="15840"/> <!-- A4纸 -->
<w:pgMar w:top="1440" w:right="1440"
w:bottom="1440" w:left="1440"/> <!-- 页边距 -->
</w:sectPr>
</w:body>
</w:document>
根元素
根元素永远是<w:document>,声明必要的命名空间。
背景颜色
<w:background> 指定整个文档的背景颜色,w:val 是RGB十六进制值。如果是白色就是FFFFFF,这个元素可选。
body
<w:body> 包含文档的所有正文内容,以及最后一个节的节属性w:sectPr。
6.2 body可以包含什么
在<w:body>中,可以包含以下块级元素:
| 元素 | 说明 |
|---|---|
w:p | 段落(Paragraph) |
w:tbl | 表格(Table) |
w:sdt | 结构化文档标签(内容控件Content Control) |
w:sectPr | 节属性,必须在最后 |
所以body的内容就是一系列的段落和表格,最后跟着节属性。
多级结构
表格内部可以包含段落,所以结构可以嵌套:
body
├── p
├── tbl
│ └── tr
│ └── tc
│ └── p
└── sectPr
6.3 段落(p)的完整结构
我们已经知道段落基本结构,现在看完整的段落结构:
<w:p>
<w:pPr> <!-- 段落属性 -->
<w:pStyle w:val="Heading1"/> <!-- 样式引用 -->
<w:jc w:val="center"/> <!-- 对齐方式 -->
<w:ind w:left="480"/> <!-- 左缩进 -->
<w:spacing w:line="360"/> <!-- 行间距 -->
<!-- ... 其他段落属性 ... -->
</w:pPr>
<!-- 段落内容:一系列run和其他元素 -->
<w:r>
<w:rPr>...</w:rPr>
<w:t>文本</w:t>
</w:r>
<w:br/> <!-- 换行符 -->
<w:r>...</w:r>
</w:p>
pPr(段落属性)
pPr包含该段落的所有格式属性:
- 样式引用:
w:pStyle - 对齐:
w:jc - 缩进:
w:ind - 间距:
w:spacing - 边框:
w:pBdr - 分页设置:
w:pageBreakBefore - …等等
我们后面会分章节详细讲解这些属性。
段落内容
段落属性之后,是段落内容,可以包含:
| 元素 | 说明 |
|---|---|
w:r | 文本运行 |
w:br | 手动换行(软回车) |
w:cr | 回车(很少用) |
w:tab | 制表符 |
w:drawing | 绘图(图片、形状) |
w:hyperlink | 超链接 |
w:commentRangeStart / w:commentRangeEnd | 批注范围 |
w:pict | 旧版图片(VML) |
最常见的就是多个w:r(运行)。
6.4 运行(r)的完整结构
运行的完整结构:
<w:r>
<w:rPr> <!-- 运行属性 -->
<w:rStyle w:val="Emphasis"/> <!-- 字符样式引用 -->
<w:b/> <!-- 粗体 -->
<w:i/> <!-- 斜体 -->
<w:color w:val="FF0000"/> <!-- 字体颜色 -->
<w:sz w:val="24"/> <!-- 字号 -->
<!-- ... 其他字符属性 ... -->
</w:rPr>
<w:t>文本内容</w:t> <!-- 文本 -->
</w:r>
rPr(运行属性)
rPr包含字符级别格式:
- 样式引用:
w:rStyle - 粗体:
w:b - 斜体:
w:i - 下划线:
w:u - 删除线:
w:strike - 字体:
w:rFonts - 字号:
w:sz - 颜色:
w:color - …等等
t(文本)元素
<w:t>包含实际文本。需要注意:
- XML会自动处理特殊字符:
<要写成<,&要写成& - 如果文本开头或结尾有空格,需要加
xml:space="preserve"保留空格:<w:t xml:space="preserve"> 两边有空格 </w:t>
6.5 特殊内容
让我们看看一些常见的特殊内容在XML中是怎么表示的。
换行符
手动换行(软换行,Shift+Enter)用<w:br/>表示:
<w:r>
<w:t>第一行</w:t>
</w:r>
<w:br/>
<w:r>
<w:t>第二行</w:t>
</w:r>
换行仍然在同一个段落内,只是换行。
制表符
制表符用<w:tab/>表示:
<w:r>
<w:t>开头</w:t>
<w:tab/>
<w:t>缩进内容</w:t>
</w:r>
分页符
硬分页符(插入分页)一般表示为段落前分页,在段落属性里:
<w:p>
<w:pPr>
<w:pageBreakBefore/>
</w:pPr>
...
</w:p>
表示这个段落要放在新的一页。
6.6 修订(Track Changes)
当开启修订功能后,删除和插入的内容怎么存储?
删除的内容
删除的内容放在<w:del>里:
<w:del w:id="1" w:author="张三" w:date="2024-01-01T10:00:00Z">
<w:p>
<w:r>
<w:delText>被删除的文字</w:delText>
</w:r>
</w:p>
</w:del>
删除的内容仍然保存在文档中,Word会显示删除线,用户可以选择接受或拒绝。
插入的内容
插入的内容用<w:ins>包裹:
<w:ins w:id="2" w:author="张三" w:date="2024-01-01T10:00:00Z">
<w:r>
<w:t>新插入的文字</w:t>
</w:r>
</w:ins>
Word会用下划线标记插入内容。
作者和日期
每个插入删除都记录:
w:id:修订IDw:author:作者名称w:date:修改日期
6.7 批注(Comment)
批注怎么存储?
批注本身存在word/comments.xml文件中,正文里只有范围标记:
<!-- 在document.xml中 -->
<w:commentRangeStart w:id="1"/>
<w:p>
<w:r>
<w:t>被批注的文字</w:t>
</w:r>
</w:p>
<w:commentRangeEnd w:id="1"/>
<w:commentReference w:id="1"/>
真正的批注内容在comments.xml:
<w:comments>
<w:comment w:id="1" w:author="张三" w:date="...">
<w:p>
<w:r>
<w:t>这是批注内容</w:t>
</w:r>
</w:p>
</w:comment>
</w:comments>
这样设计的好处是批注内容集中存放,正文只需要标记范围。
6.8 超链接
超链接用<w:hyperlink>表示:
<w:hyperlink r:id="rId1">
<w:r>
<w:rPr>
<w:rStyle w:val="Hyperlink"/>
<w:color w:val="0000FF"/>
<w:u w:val="single"/>
</w:rPr>
<w:t>点击这里</w:t>
</w:r>
</w:hyperlink>
超链接的目标URL存在关系文件document.xml.rels中:
<Relationship Id="rId1" Type="..." Target="https://example.com"/>
本章小结
- document.xml根结构:
w:document→w:body→ 内容 +w:sectPr - body可以包含段落和表格等块级元素
- 段落结构:
w:p→w:pPr(属性) + 内容(多个w:r) - 运行结构:
w:r→w:rPr(属性) +w:t(文本) - 删除内容放在
w:del,插入内容放在w:ins(修订追踪) - 批注范围标记在正文,内容在comments.xml
下一章我们讲解样式定义机制,这是Word格式理解的重点和难点。