Uppsala 是一个零依赖、纯 Rust 编写的 XML 工具库,它从最底层的解析到上层的模式验证,几乎涵盖了处理 XML 时可能需要的所有核心功能,而且代码量相对可控,很适合学习或集成到项目中。
为了方便快速了解它的全貌,整理了一个核心功能表格:
| 功能模块 | 说明与特点 |
|---|---|
| 零依赖 & 纯 Rust | 整个库不依赖任何外部 C 库或其他 Rust crate,所有代码,包括解析器、XPath 引擎和 XSD 正则引擎,都是从头用 Rust 写成的。 |
| XML 1.0 解析 | 实现了 XML 1.0 (第五版) 的解析和良构性检查,并通过了 100% 的 W3C 官方 XML 一致性测试套件(共 1208 项测试)。 |
| 命名空间支持 | 完整支持 XML 命名空间标准,包括前缀解析和作用域管理,这对于处理复杂文档(如 SAML)很重要。 |
| DOM 操作 | 提供了一个基于"竞技场 (Arena)"的 DOM 模型,所有的节点都存储在一个数组中,通过索引来引用。这种设计避免了 Rc/RefCell 的开销,操作效率高,并且支持插入、删除、替换等树形结构修改。 |
| XPath 1.0 查询 | 内置了 XPath 1.0 的完整引擎,支持所有的轴、函数、谓词和操作符,可以方便地查询和提取 XML 文档中的数据。 |
| XSD 1.1 验证 | 支持 XML Schema 1.1 的校验,包含结构和数据类型验证,内置了超过 40 种数据类型。它针对 W3C 的 Schema 测试套件(如 NIST、Sun、MS 测试集)几乎全部通过,校验能力非常可靠。 |
| XML 生成 | 提供了两种方式:一种是 XmlWriter,可以像流式构建器一样逐步写出 XML,不需要构建完整的 DOM 树,适合生成大型文档;另一种是序列化,可以将 DOM 树漂亮地打印成字符串。 |
| 性能优化 | 在 x86_64 架构上,它利用 SSE2 指令加速了文本内容和属性值的扫描。根据官方在 SAML 风格文档上的对比测试,它的解析速度通常比同类知名库 roxmltree 更快(快 1.16 到 1.74 倍不等)。 |
📁 代码架构
如果你有兴趣阅读源码,它的目录结构也设计得比较清晰,功能模块是分开的:
parser.rs: XML 解析器的核心实现。dom.rs: DOM 数据结构和操作方法。namespace.rs: 命名空间处理。xpath.rs: XPath 1.0 引擎。xsd/: XSD 验证器的完整实现(一个独立的子模块)。writer.rs: XmlWriter 的构建器实现。
一点背景信息 :Uppsala 最初是作者在工作中为了处理 SAML(一种基于 XML 的认证协议)而开发的,因此它在处理带有命名空间的、结构比较规范的文档时,设计和优化都很有针对性。这和你处理标签打印机格式文档的场景是比较契合的。
💎 总结
Uppsala 在代码的简洁性 (零依赖、纯 Rust)、功能的完整度 (从解析到校验)和质量保障 (高通过率的官方测试)之间取得了不错的平衡。虽然它的社区规模可能没有 quick-xml 庞大,但对于有应用场景和学习目标要求的人来说,是一个非常扎实、靠谱的选择。