外观
dom.el
约 1337 字大约 4 分钟
2025-11-03
Emacs 内置的 dom.el 为 DOM 操作提供了基础功能。
解析为 DOM 树
Emacs 可以编译时内置 libxml2 支持。
libxml-available-p
如果此 Emacs 会话中内置了 libxml2 支持,则此函数返回非 nil。
当 libxml2 支持可用时,可以使用以下函数将 HTML 或 XML 文本解析为 Lisp 对象树。
libxml-parse-html-region &optional start end base-url discard-comments
如果此 Emacs 会话中内置了 libxml2 支持,则此函数返回非 nil。
此函数将起始位置和结束位置之间的文本解析为 HTML,并返回一个表示 HTML 解析树的列表。它力求通过稳健地处理语法错误来应对实际的 HTML 代码。
如果 start 或 end 为 nil,则它们分别默认为 point-min 和 point-max 中的值。
如果 base-url 参数不为 nil,则该参数用于 libxml2 库报告的警告和错误,但 Emacs 目前调用该库时禁用了错误和警告,因此未使用此参数。
如果可选参数 discard-comments 不为 nil,任何顶级注释都会被丢弃。(此参数已过时,且此功能将在未来的 Emacs 版本中移除。要移除注释,请使用以下方法:在调用解析函数之前,对数据使用 xml-remove-comments 实用函数。)
在解析树中,每个 HTML 节点都由一个列表表示,其中第一个元素是表示节点名称的符号,第二个元素是节点属性的列表,其余元素是子节点。
以下示例对此进行了演示。给定以下(格式错误的)HTML 文档:
<html><head></head><body width=101><div class=thing>Foo<div>Yes调用 libxml-parse-html-region 会返回此 DOM。(文档对象模型):
(html nil
(head nil)
(body ((width . "101"))
(div ((class . "thing"))
"Foo"
(div nil
"Yes"))))由 libxml-parse-html-region (以及其他 XML 解析函数)返回的 DOM 是一个树结构,其中每个节点都有一个节点名称(称为标签),可选的键/值属性列表,然后是一个子节点列表。子节点可以是字符串或 DOM 对象。
(body ((width . "101"))
(div ((class . "thing"))
"Foo"
(div nil
"Yes")))创建 DOM 节点
dom-node tag &optional attributes &rest children
此函数创建一个类型为 tag 的 DOM 节点。如果提供,attributes 应该是键/值对列表。如果提供,children 应该是 DOM 节点。
DOM 访问器
以下函数可用于处理 DOM 结构。每个函数都接受一个 DOM 节点,或节点列表。在后一种情况下,仅使用列表中的第一个节点。
dom-tag node
返回节点的标签(也称为“节点名称”)。
dom-attr node attribute
返回节点属性的值。常见用法包括:
dom-children node
返回节点的所有子节点。
dom-non-text-children node
返回节点的所有非字符串子节点。
dom-attributes node
返回节点属性的键/值对列表。
dom-text node
返回节点所有文本元素作为连接的字符串。
dom-texts node
递归地返回节点及其所有子节点的文本元素,作为连接的字符串。此函数还接受一个可选的分隔符,用于在文本元素之间插入。
dom-parent dom node
返回 DOM 中节点的父节点。
dom-remove dom node
从 DOM 中移除节点。
修改 DOM 节点和属性
以下是为修改 DOM 而提供的函数。
dom-set-attribute node attribute value
将节点的属性设置为值。
dom-remove-attribute node attribute
从节点中删除属性。
dom-append-child node child
将 child 节点追加为节点的最后一个子节点。
dom-add-child-before node child before
将 child 节点添加到节点的子节点列表中在 before 节点之前的位置。如果 before 是 nil ,则使 child 节点成为第一个子节点。
dom-set-attributes node attributes
用新的键/值列表替换节点的所有属性。
搜索 DOM 节点
以下是在 DOM 中搜索元素的函数。它们都返回匹配节点的列表。
dom-by-tag dom tag
返回 dom 中所有类型为 tag 的节点。
dom-by-class dom match
返回所有在 dom 中具有与 match 匹配的类名的节点,其中 match 是一个正则表达式。
dom-by-style dom style
返回所有在 dom 中具有与 match 匹配的样式的节点,其中 match 是一个正则表达式。
dom-by-id dom style
返回所有在 dom 中具有与 match 匹配的 ID 的节点,其中 match 是一个正则表达式。
dom-search dom predicate
返回所有在 dom 中,当 predicate 返回非 nil 值的节点。predicate 以 dom 中的 node 为参数。
dom-strings dom
返回 dom 中的所有字符串。
打印 DOM 结构
以下是打印 dom 的函数。
dom-pp dom &optional remove-empty
在当前位置美化打印 dom。如果 remove-empty 非 nil, 则不打印仅包含空白字符的文本节点。
dom-print dom &optional pretty xml
在当前位置打印 dom。如果 xml 非 nil,则按 XML 打印;否则按 HTML 打印。如果 pretty 非 nil,则对 HTML/XML 进行逻辑缩进。
