扩展库 / xml.sax

xml.sax

按事件迭代或回调解析 XML。

适合不需要构建完整文档树的输入;事件含类型、名称、文本、属性和位置信息。DTD 与外部实体默认拒绝。

2026-10-30:修复三包每线程错误状态首次初始化失败后的半成功返回;SAX 在创建/next/close 前准备状态,不消费事件、不关闭流。15 原生入口 Windows 270 / Linux 257 场景通过,两个平台旧桥接各 60 场景失败;四线程 144 诊断的 GCC/TCC JIT/AOT、新旧双语例、各 19 份正常 AOT 和 58 实际 C 原型检查通过,Linux 带 ASan/UBSan。公开 ABI、Expat 与冻结 XRT 未改。

当前完整门禁仍为红:Windows 前 345 项符合预期,末项公开 Reader 类型正例失败,Linux 同样止于该 M9;Node/Element 另验也未导出。不能以工厂调用通过代替公开类型与安全构造验收。门禁保留失败现场;旧 XML 黄金文件规范为 LF。包内新增 catalog_stream 双语目录统计、限额拒绝与恢复范例,固定同一输出;详细合同及证据见 README。

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

2026-10-24:Windows 三包联合门禁的 C/XLang 边界及 SAX/DOM/ElementTree 各自的边界、分配、范例独立 EXE 全部通过;Linux C ASan/UBSan 与 XLang JIT 双语门禁通过。Linux 独立 EXE 本轮未验收。下方旧缺符号记录只描述当时的发布物。

API

接口用途
xml.sax.reader(text)从文本创建可迭代读取器
xml.sax.open(path)从文件创建读取器
Reader.close()提前停止并检查拥有型输入的关闭结果
xml.sax.parse / parseFile用回调处理 XML 事件
errorCode / errorLine / errorColumn读取当前线程的解析错误位置
xrtXmlNameValid(C)按 XML 1.0 校验 UTF-8 名称,供树包复用

范例

import xml.sax
for event in xml.sax.reader("<root><item>你好</item></root>")
    println(event["type"])
end

XLang 显式解析限额必须为正;C 的 XRT 限额配置以 0 表示不限制,保留字段及未支持的资源策略标志必须为 0。DTD 与外部实体使用独立选项。设置有限上限时,单段文本或单个属性值超过单项上限、文本与属性值累计超过输出上限、或单个元素属性多于条目上限都会拒绝。文件路径含 NUL 时会拒绝;Reader 可以迭代或调用 next()。C push 解析接管 Reader 时,关闭失败按底层错误报告 MEMORY 或 IO;C pull 在拥有型 Reader 正常读到 EOF 时也先关闭,失败返回 ERROR,不伪装成 END。提前停止可调用 Reader.close() 或 C 的 xrtXmlSaxClose 检查关闭结果;借用 Reader 保持开放,void Destroy 仅作兜底释放。共享 Linux 门禁覆盖 SAX/DOM/ElementTree 的 C ASan/UBSan、XLang 边界和双语范例逐字对照。事件所有权、错误位置和验证命令见包内 README。

2026-10-20 三包共用门禁增加固定 UTF-8 黄金输出;Windows 快速模式与 Linux ASan/UBSan 联合门禁通过。Windows 默认门禁还要逐包执行完整范例 AOT,当时在 SAX 构建处因共享 xl6ValueDataSnapshotV1 缺符号停止。构建目录每次独占并清理,该次 AOT 未签收。

自定义 Reader 的读取或关闭回调报告内存故障时,SAX 现在保留 MEMORY 分类;普通流故障仍为 IO。push、pull、提前关闭的 C 回归先红后绿;Windows/Linux 三包聚焦门禁通过,完整 AOT 未在本轮验收。

C push 入口的空事件回调在读取前报告 ARGUMENT,传入的拥有型 Reader 仍释放;C pull 的 Next 对无效 Reader 报告 ARGUMENT,成功时清空调用方复用的错误结构。2026-10-26 双平台完整运行门禁通过;剩余的公开类型边界见包内 README。