33.30.1 文档对象模型

libxml-parse-html-region(以及其他 XML 解析函数)返回的 DOM(文档对象模型)是一种树状结构, 其中每个节点包含节点名称(称为 标签(tag))、可选的键值对形式的 属性(attribute) 列表, 以及 子节点(child nodes) 列表。子节点可以是字符串或 DOM 对象。

(body ((width . "101"))
 (div ((class . "thing"))
  "Foo"
  (div nil
   "Yes")))
Function: dom-node tag &optional attributes &rest children

该函数创建一个类型为 tagDOM 节点。若提供 attributes, 其值应为键值对列表。若提供 children,其值应为 DOM 节点。

以下函数可用于操作此结构。每个函数接收一个 DOM 节点或节点列表, 若为节点列表,则仅使用列表中的第一个节点。

简单访问函数:

dom-tag node

返回节点的 标签(tag)(也称为“节点名称”)。

dom-attr node attribute

返回节点中 attribute 属性的值。常见用法如下:

(dom-attr img 'href)
=> "https://fsf.org/logo.png"
dom-children node

返回节点的所有子节点。

dom-non-text-children node

返回节点的所有非字符串类型子节点。

dom-attributes node

返回节点的属性键值对列表。

dom-text node

将节点的所有文本元素拼接为字符串并返回。

dom-texts node

递归地将节点及其所有子节点的文本元素拼接为字符串并返回。 该函数还支持传入可选的分隔符,用于插入到各文本元素之间。

dom-parent dom node

返回 domnode 节点的父节点。

dom-remove dom node

node 节点从 dom 中移除。

以下是用于修改 DOM 的函数。

dom-set-attribute node attribute value

将节点的 attribute 属性设置为 value

dom-remove-attribute node attribute

从节点中移除 attribute 属性。

dom-append-child node child

child 作为 node 节点的最后一个子节点追加进去。

dom-add-child-before node child before

node 节点的子节点列表中,将 child 插入到 before 节点之前。 若 beforenil,则将 child 设为第一个子节点。

dom-set-attributes node attributes

用新的键值对列表替换节点的所有属性。

以下是用于在 DOM 中搜索元素的函数,均返回匹配节点的列表。

dom-by-tag dom tag

返回 dom 中所有类型为 tag 的节点。典型用法如下:

(dom-by-tag dom 'td)
=> '((td ...) (td ...) (td ...))
dom-by-class dom match

返回 dom 中类名匹配 match(正则表达式)的所有节点。

dom-by-style dom style

返回 dom 中样式匹配 match(正则表达式)的所有节点。

dom-by-id dom style

返回 dom 中 ID 匹配 match(正则表达式)的所有节点。

dom-search dom predicate

返回 dom 中使 predicate 函数返回非 nil 值的所有节点。 调用 predicate 时会将待测试的节点作为参数传入。

dom-strings dom

返回 dom 中的所有字符串。

工具函数:

dom-pp dom &optional remove-empty

在当前光标位置格式化打印 dom。若 remove-empty 为真,则不打印仅包含空白字符的文本节点。

dom-print dom &optional pretty xml

在当前光标位置打印 dom。若 xml 为非 nil,则按 XML 格式打印; 否则按 HTML 格式打印。若 pretty 为非 nil,则对 HTML/XML 进行逻辑缩进。