Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第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"/> <!-- 对齐:右对齐 -->

布尔属性的表示

对于开关类型的属性(开/关),有几种表示方式:

  1. 只写标签,没有val - 表示开

    <w:b/>  <!-- 粗体打开 -->
    
  2. 用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 动手练习

现在你可以自己动手试试:

  1. 解压一个简单的docx文件
  2. 用文本编辑器打开word/document.xml
  3. 找找看:w:document, w:body, w:p, w:r, w:t这些元素
  4. 看看段落属性w:pPr和运行属性w:rPr在哪里
  5. 看看不同格式文字是不是分成不同的run

亲手看一次,你对结构的理解会深刻很多。


本章小结

  • document.xml的基本结构:w:documentw:bodyw:pw:rw:t
  • 段落(p)是块级单位,对应一次回车
  • 运行(r)是同一格式的文本片段,段落内格式变化就分多个run
  • 段落属性在w:pPr,运行属性在w:rPr
  • 属性通常用w:val指定值,布尔属性可以只写标签表示开启
  • w:sectPr是节属性,放在body最后,包含页面设置

现在我们已经入门了,下一章深入讲解主文档结构。