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

第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会自动处理特殊字符:< 要写成 &lt;& 要写成 &amp;
  • 如果文本开头或结尾有空格,需要加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:修订ID
  • w: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:documentw:body → 内容 + w:sectPr
  • body可以包含段落和表格等块级元素
  • 段落结构:w:pw:pPr(属性) + 内容(多个w:r
  • 运行结构:w:rw:rPr(属性) + w:t(文本)
  • 删除内容放在w:del,插入内容放在w:ins(修订追踪)
  • 批注范围标记在正文,内容在comments.xml

下一章我们讲解样式定义机制,这是Word格式理解的重点和难点。