科技 · 实用指南
ElementTree 报“unbound prefix”?修复 XML 前先证明命名空间
先保留原始字节,区分损坏的完整文档与脱离祖先作用域的片段;只有权威 URI 能证明绑定时才注入命名空间。

ElementTree 在限定名称使用的前缀没有处于作用域内的声明时抛出 unbound prefix。同一错误既可能来自无效的完整文档,也可能来自失去祖先 xmlns 声明的有效片段。先保存原始字节,再判断属于哪一种。
不要猜 URI,也不要把 register_namespace() 当作解析修复。应从完整文档、模式、生产者合同或被截断的祖先节点证明绑定;仅在内存包装器中注入已证明的声明,并核对展开名、属性、文本、tail 与修复清单。
修复前保存证据
读取并哈希原始字节,记录解析器、Python 版本、错误行列与附近前缀。原件与修复副本分开保存。
若上游只传了片段,要明确记录截断边界;这不同于生产者输出无效完整文档。
先判定作用域为何丢失
检查完整文档与祖先链的 xmlns。祖先存在声明时,从权威父文档或合同恢复精确 URI;没有依据就拒绝或隔离。
同一个前缀在不同作用域可映射不同 URI,只看拼写不是身份依据。
分开解析、查询和序列化控制
register_namespace() 影响输出前缀,find() 的映射影响树上的查询,二者都不能修复未声明前缀的输入。
URI 有权威证据时,只在内存包装器增加一个声明,保留源摘要并记录变更。
隔离宽松恢复
宽松解析器可能闭合标签、丢弃 token 或改动无关结构,只能用于取证提取。
比较恢复结果与不可变原件,列出全部诊断;变更超过已证明绑定就不通过。
按语义身份验收
断言预期 {URI}local 元素和属性、节点数、顺序、文本、tail 与业务标识。
保存原件摘要、URI 来源、包装变换、诊断与验收结果;能解析不等于语义未变。
