扩展库 / xml.dom

xml.dom

解析、编辑和序列化 XML 文档树。

基于 XRT/Expat;支持元素、文本、注释、属性和父子节点操作。DTD 与外部实体默认拒绝。解析文本按显式字节长度直接传入,不创建整份输入的 Buffer 副本。

2026-10-30:parse/load/stringify/save 在每线程错误状态初始化失败时立即保留 MemoryError,不继续操作或改写原目标。三包 15 入口 Windows 270 / Linux 257 场景通过,换旧桥接各 60 场景失败;四线程 144 诊断的 GCC/TCC JIT/AOT、各 19 份普通独立 AOT、58 实际 C 原型与 Linux ASan/UBSan 通过。公开 ABI、类声明、Expat 和冻结 XRT 未改。

整包仍待 M9/M3:默认门禁现在保留公开 Reader 正例,运行部分通过后在该项失败;Node/Element 另验同样失败。不能用工厂路径通过代替公开类型与原生构造器边界,旧全通过记录不覆盖新正例。完整证据见 SAX 共用审查记录和包 README。

2026-10-26 当前 Windows/Linux 三包联合默认门禁均通过:严格 C、Linux ASan/UBSan、语言 JIT、中央/边界/分配与公开双语范例独立 EXE,以及 DOM/ElementTree 往返。旧 VFS 和共享快照缺失不再复现。Node 尚不能在包外命名;原生句柄构造器的安全边界修复前,本包仍待签收。

2026-10-24:Windows 三包联合门禁的 C/XLang 边界、DOM/ElementTree 往返及三包各自的边界、分配、范例独立 EXE 全部通过;Linux C ASan/UBSan 与 XLang JIT 双语门禁通过。Linux 独立 EXE 未验收;包外命名 Node 仍受访问控制阻断。下方旧缺符号记录只描述当时的发布物。

API

接口用途
xml.dom.parse / load从文本或文件读取文档
xml.dom.createDocument()创建空文档
Node.child / children / appendChild读取与修改节点树
Node.stringify(...) / save(...)序列化或原子保存文档

范例

import xml.dom
auto document = xml.dom.parse("<root id='one'><child>你好</child></root>")
auto root = document.documentElement
assert root.child(0).textContent == "你好"

节点引用由对象管理;C 调用方按包内 README 释放引用。C 解析接管 Reader 时,关闭失败按底层错误返回 MEMORY 或 IO,不返回未确认关闭的文档树。XLang 显式解析限额必须为正,C 的 XRT 限额配置以 0 表示不限制;写出缩进为 0..16。名称遵循 XML 1.0,写出拒绝无效字符、注释和处理指令;属性空白与文本回车往返保持原值。保存失败不会覆盖已有文件。文本读取与写出使用显式遍历栈,可处理调用方放宽限额后的深树;8192 层解析/读取/序列化、内存故障和限额已有 C 回归。共享 Linux 门禁通过 C ASan/UBSan、三包 XLang 边界及双语范例逐字对照;Windows 标准输出行尾可能不同。

2026-10-21 保存与流写出的分配故障按内存错误报告,不再误报 IO;真实写入和关闭失败仍按 IO 报告。C 保存逐点注入、流故障、XLang save() 异常分类和故障后恢复通过 Windows/Linux 联合门禁;完整 AOT 阻断未变。

C 的空输出 Writer、NULL 或空保存路径在序列化前报告 ARGUMENT,不误报为 IO 或先执行耗费内存的写出;对应负例与现有正常输出通过 Windows/Linux 三包联合门禁。2026-10-26 双平台完整运行门禁通过;剩余的公开类型边界见包内 README。

2026-10-20 三包共用门禁增加 DOM 范例固定 UTF-8 黄金输出,Windows 快速模式与 Linux ASan/UBSan 联合门禁通过。默认 AOT 门禁先在 SAX 构建处遇到共享 xl6ValueDataSnapshotV1 缺符号,DOM AOT 尚未执行到,不作发布级签收。

Load(path) 打开 Reader 时的分配失败现在报告 MEMORY,不再误报 IO;C 注入失败和清除后重试通过 Windows/Linux 三包门禁。完整带输出 AOT 仍未签收。