第5章:文档结构入门
学习目标
- 理解Word文档的整体结构
- 认识
document.xml的基本框架 - 理解块(block)和行(inline)层次
- 理解段落(paragraph)和运行(run)的概念
- 理解属性的表示方式
5.1 document.xml 的整体结构
我们已经知道,主文档内容在word/document.xml中。让我们来看一个最简单的完整例子:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:body>
<w:p>
<w:r>
<w:t>你好,Word!</w:t>
</w:r>
</w:p>
<w:sectPr/>
</w:body>
</w:document>
这就是一个只包含一段文字“你好,Word!“的完整document.xml。我们逐层拆解。
层次结构
w:document
└── w:body (文档正文)
├── w:p (段落Paragraph)
│ └── w:r (运行Run)
│ └── w:t (文本Text)
└── w:sectPr (节属性Section Properties)
最外层是<w:document>,里面是<w:body>,正文都在body里。
5.2 核心概念:段落(p)和运行(r)
理解段落和运行是理解WordprocessingML的关键。
段落(Paragraph,w:p)
- 段落是Word中块级内容的基本单位
- 一个段落对应Word中你敲一个回车产生的段落
- 每个段落有自己的段落格式(对齐、缩进、间距等)
- 段落可以包含多个运行(run)
运行(Run,w:r)
- 运行是段落中具有相同格式的一段文本
- 同一个段落中,如果文字格式变化了,就需要分成多个run
- 例如:一句话中,一部分是粗体,一部分不是,就需要两个run
文本(Text,w:t)
<w:t>元素包含实际的文本内容- 一个run中可以有一个
<w:t>
例子:多个run的段落
来看一个例子:这句话“这是粗体文字“,“粗体“两个字是粗体,XML会写成:
<w:p>
<w:r>
<w:t>这是</w:t>
</w:r>
<w:r>
<w:rPr>
<w:b/>
</w:rPr>
<w:t>粗体</w:t>
</w:r>
<w:r>
<w:t>文字</w:t>
</w:r>
</w:p>
看到了吗?因为格式变化了,所以分成了三个run:
- 第一个run:“这是”,普通格式
- 第二个run:“粗体”,带有粗体属性
<w:b/> - 第三个run:“文字”,回到普通格式
这就是run的作用:同一个段落内,不同格式要分开。
5.3 结构层次总结
WordprocessingML的结构层次:
| 层次 | 元素 | 作用 |
|---|---|---|
| 文档 | w:document | 整个文档根 |
| 正文 | w:body | 正文容器 |
| 段落 | w:p | 块级单位,一个回车就是一段 |
| 运行 | w:r | 同一格式的文本片段 |
| 文本 | w:t | 实际文本内容 |
为什么这么设计?
这样的设计很灵活:
- 可以在段落中间改变格式
- 每个run独立设置格式
- 结构清晰,容易解析
5.4 属性的表示方式
在Open XML中,格式属性怎么表示?
属性元素
大多数格式属性都有专门的元素表示:
- 粗体:
<w:b/> - 斜体:
<w:i/> - 下划线:
<w:u w:val="single"/>
属性存储位置
- 段落属性存在
<w:pPr>(paragraph properties) - 运行属性存在
<w:rPr>(run properties)
例如:
<w:p>
<w:pPr>
<!-- 段落属性在这里 -->
<w:jc w:val="center"/> <!-- 居中对齐 -->
</w:pPr>
<w:r>
<w:rPr>
<!-- 运行属性在这里 -->
<w:b/> <!-- 粗体 -->
<w:color w:val="FF0000"/> <!-- 红色 -->
</w:rPr>
<w:t>居中和红色粗体</w:t>
</w:r>
</w:p>
w:val 属性
很多属性元素使用w:val属性来指定值:
<w:sz w:val="24"/> <!-- 字号:24半磅 = 12磅 -->
<w:jc w:val="right"/> <!-- 对齐:右对齐 -->
布尔属性的表示
对于开关类型的属性(开/关),有几种表示方式:
-
只写标签,没有val - 表示开
<w:b/> <!-- 粗体打开 --> -
用val表示 -
w:val="1"或w:val="true"表示开,w:val="0"或w:val="false"表示关<w:b w:val="1"/> <!-- 粗体打开 --> <w:b w:val="0"/> <!-- 粗体关闭 -->
两种写法Word都支持,第一种更简洁。
5.5 节属性(sectPr)
在w:body的最后,你通常会看到<w:sectPr>元素。
什么是节(section)?
- 节是Word中页面设置的单位
- 一个文档可以分成多个节,每节可以有不同的页面设置
- 节属性包含页面大小、方向、边距等设置
- 最后一个节的节属性放在body末尾
最简单的情况,文档只有一节,所以body最后放一个sectPr:
<w:body>
<!-- ... 所有内容 ... -->
<w:sectPr/>
</w:body>
如果有分页设置不同的页面方向(比如前几页纵向,中间一页横向,后面又纵向),就需要分多个节,每个节有自己的sectPr。
我们后面讲页眉页脚和分节的时候会详细说。
5.6 一个完整的例子
让我们来看一个稍微完整一点的例子,包含两段不同对齐方式,一些文字格式:
<?xml version="1.0" encoding="UTF-8"?>
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:body>
<!-- 第一段:居中标题 -->
<w:p>
<w:pPr>
<w:jc w:val="center"/>
</w:pPr>
<w:r>
<w:rPr>
<w:b/>
<w:sz w:val="36"/>
</w:rPr>
<w:t>标题</w:t>
</w:r>
</w:p>
<!-- 第二段:左对齐正文 -->
<w:p>
<w:pPr>
<w:jc w:val="left"/>
</w:pPr>
<w:r>
<w:t>这是一段普通文字,这里有</w:t>
</w:r>
<w:r>
<w:rPr>
<w:i/>
</w:rPr>
<w:t>斜体</w:t>
</w:r>
<w:r>
<w:t>和</w:t>
</w:r>
<w:r>
<w:rPr>
<w:b/>
</w:rPr>
<w:t>粗体</w:t>
</w:r>
<w:r>
<w:t>。</w:t>
</w:r>
</w:p>
<w:sectPr/>
</w:body>
</w:document>
这个例子展示了:
- 段落级格式(对齐)放在
w:pPr - 运行级格式(粗体、斜体、字号)放在
w:rPr - 格式变化就分成多个run
现在你应该能看懂基本的document.xml了。
5.7 动手练习
现在你可以自己动手试试:
- 解压一个简单的docx文件
- 用文本编辑器打开
word/document.xml - 找找看:
w:document,w:body,w:p,w:r,w:t这些元素 - 看看段落属性
w:pPr和运行属性w:rPr在哪里 - 看看不同格式文字是不是分成不同的run
亲手看一次,你对结构的理解会深刻很多。
本章小结
document.xml的基本结构:w:document→w:body→w:p→w:r→w:t- 段落(p)是块级单位,对应一次回车
- 运行(r)是同一格式的文本片段,段落内格式变化就分多个run
- 段落属性在
w:pPr,运行属性在w:rPr - 属性通常用
w:val指定值,布尔属性可以只写标签表示开启 w:sectPr是节属性,放在body最后,包含页面设置
现在我们已经入门了,下一章深入讲解主文档结构。