# 文档与 Schema

用一段加粗文字理解节点、标记、属性和内容规则。

QuireKit 把正文保存为文档树。例如一段加粗的“Hello”，包含三层节点：整份文档、段落、文字。粗体是文字上的格式，不是另一个段落。

## 节点、标记和属性

```json [一段加粗文字]
{
  "type": "doc",
  "content": [{
    "type": "paragraph",
    "content": [{
      "type": "text",
      "text": "Hello",
      "marks": [{ "type": "bold" }]
    }]
  }]
}
```

节点（Node）表达结构，如段落、标题和列表。标记（Mark）表达文字格式，如粗体和链接。属性（`attrs`）保存附加信息，例如标题的级别或链接的地址。

`content` 是子节点数组。因此列表可以包含列表项，列表项里再包含段落；这种层级本身就是文档的一部分。

## Schema 是内容规则

Schema 由已安装的节点和标记扩展组成，规定允许哪些节点、每种节点能包含什么、有哪些属性与格式。StarterKit 已经提供常用规则，普通文章可以从它开始。

增加一种业务结构时，先定义 Node，再提供相应的命令与显示方式。只在界面里画一个提示框，不会让它自动进入可保存的文档。

## 同一份内容，多种显示方式

JSON 描述文字和结构，DOM、Canvas、SVG 则是显示方式。屏幕坐标和选区高亮属于视图；它们不需要存进正文。自定义节点的 HTML 输出也不会自动提供 Canvas 布局。

## 常用读写入口

| 想做什么 | 调用什么 |
| --- | --- |
| 保存产品自己的结构化内容 | `editor.getJSON()` |
| 输出 HTML | `editor.getHTML()` |
| 替换普通正文 | `editor.commands.setContent(content)` |
| 恢复包含顶层属性的完整文档 | `editor.commands.replaceDocument(content)` |

读取旧内容时，要安装相容的扩展，并检查模型版本与 Schema。无法识别的内容应报错或迁移，保留原始文件。具体步骤见[保存与恢复](/guide/persistence)；文章与 Word 模型的选择见[文档模型](/build/model)。
