Google 文档文档的结构

为了有效地使用 Google 文档 API,您必须了解 Google 文档文档的架构和文档元素,以及它们之间的关系。本页面详细介绍了以下主题:

  • 文档元素的概念模型
  • Google 文档 API 如何表示这些元素
  • 元素的样式属性

顶级元素

Google 文档最外层的容器元素是文档。它便是可以保存在 Google 云端硬盘中、与其他用户共享以及通过文字和图片进行更新的单元。

documents 资源的顶级元素包括其 TabSuggestionsViewMode 和其他属性:

document: {
    title: ... ,
    revisionId: ... ,
    documentId: ... ,
    suggestionsViewMode: ... ,
    tabs: ...
}

标签页

单个文档可以包含多个标签页,这些标签页具有不同的文本级内容。文档的 tabs 属性是一系列 Tab 对象。Tab 由以下字段组成:

  • TabProperties:包含标签页的属性,例如 ID、标题和索引。
  • childTabs:显示标签页的子标签页(直接嵌套在其下方的标签页)。
  • DocumentTab:表示标签页的文本内容。
文档标签页的结构。
图 1. 文档标签页的结构。

后续部分简要概述了文档标签页层次结构;标签页 JSON 表示法还提供了更多详细信息。如需详细了解标签页功能,请参阅使用标签页

如需在 Body 内容之外操控全局文档标签页功能,几乎总是最好使用一个或多个文档模板,您可以将这些模板用作程序化生成新文档的基础。如需了解详情,请参阅将文本合并到文档中

正文内容

Body 通常包含文档标签页的完整内容。您可以或可能希望以编程方式使用的大多数项都是 Body 内容中的元素:

正文内容的结构。
图 2. 正文内容的结构。

结构元素

StructuralElement 用于描述为文档提供结构的内容。Body 内容是一系列 StructuralElement 对象。内容元素可对每个 StructuralElement 对象进行个性化设置,如下图所示:

结构元素。
图 3. 结构元素。

结构元素及其内容对象包含文档中的所有视觉组件。包括文本、内嵌图片和格式。

段落结构

Paragraph 是表示段落的 StructuralElement。它包含一系列以换行符结尾的内容。它由以下对象组成:

  • ParagraphElement:描述段落中的内容。
  • ParagraphStyle:一个可选元素,用于为段落明确设置样式属性。
  • Bullet:如果段落是列表的一部分,则是一个可选元素,用于提供项目符号规范。

ParagraphElement 的运作方式与 StructuralElement 类似。一组内容元素类型(例如 ColumnBreakEquation)会对自己的 ParagraphElement 进行个性化设置,如下图所示:

段落元素的结构。
图 4. 段落元素的结构。

如需查看完整文档结构的示例,请参阅 JSON 格式的文档示例。在输出中,您可以看到许多关键的结构元素和内容元素,以及开始和结束索引的使用,如下一部分所述。

文本段

TextRun 是一个 ParagraphElement,表示具有所有相同文本样式的连续文本字符串。段落可以包含多个文本行,但文本行绝不会跨越段落边界。内容会在换行符后拆分,以形成单独的文本行。例如,请考虑以下小型文档:

包含段落和项目符号列表的小文档。
图 5. 一篇小文档。

下图展示了如何直观呈现上文中段落的顺序,每个段落都有自己的 TextRun 和可选的 Bullet 设置。

文本运行的结构。
图 6. 文本行的结构。

AutoText

AutoText 是一个 ParagraphElement,表示文本中的一个位置,该位置被动态替换为可以随时间变化的内容。在 Google 文档中,此属性用于页码。

起始索引和结束索引

当您更新文档标签页中的内容时,每次更新都会在文档中的一个位置或范围内进行。这些位置和范围使用编号指定,编号表示包含文档片段内的偏移量。细分是指包含结构元素或内容元素的正文、标题、页脚或脚注。相应细分中的元素的索引相对于该细分起点。

正文内容中的大多数元素都具有从零开始的 startIndexendIndex 属性。这些属性用于指示元素的起点和终点相对于其封闭线段起点的偏移量。如需详细了解如何对批量 Docs API 调用进行排序,请参阅批量更新

索引以 UTF-16 代码单元衡量。这意味着代理项对会占用两个索引。例如,“笑脸”表情符号 😄? 表示为 \uD83D\uDE00,并占用两个索引。

对于文档正文中的元素,索引表示相对于正文内容(即“根”元素)开头的偏移量。

结构元素的“个性化”类型(SectionBreakTableOfContentsTableParagraph)没有这些索引,因为它们的封闭 StructuralElement 具有这些字段。ParagraphElement 中包含的个性化类型(例如 TextRunAutoTextPageBreak)也是如此。

访问元素

许多元素都可以使用 documents.batchUpdate 方法进行修改。例如,使用 InsertTextRequest,您可以更改包含文本的任何元素的内容。同样,您可以使用 UpdateTextStyleRequest 将格式应用于一个或多个元素中包含的文本范围。

如需读取文档的元素,请使用 documents.get 方法获取完整文档的 JSON 转储。然后,您可以解析生成的 JSON 以查找各个元素的值。如需了解详情,请参阅将文档内容输出为 JSON

解析内容对各种用例都有益。例如,假设有一个文档目录应用,用于列出它找到的文档。此应用可以提取文档标签页的标题、修订版本 ID 和起始页码,如下图所示:

文档目录的结构。
图 7. 文档目录的结构。

由于没有用于明确读取这些设置的方法,因此您的应用需要获取整个文档,然后解析 JSON 以提取这些值。

媒体资源继承

StructuralElement 可以从其父对象继承属性。对象的属性(包括其定义的属性以及其继承的属性)决定其最终的视觉外观。

文本字符格式决定了文本在文档中的呈现方式,例如粗体、斜体和下划线。您应用的格式会替换从底层段落的 TextStyle 继承的默认格式。反之,您未设置格式的任何字符都将继续继承段落的样式。

段落格式设置可确定如何在文档中渲染文本块,例如对齐方式、边框和缩进。您应用的格式会覆盖从底层 ParagraphStyle 继承的默认格式。反之,您未设置的任何格式功能都将继续从段落样式继承。