3 个版本 (破坏性更新)

0.3.0 2024 年 4 月 14 日
0.2.0 2024 年 3 月 8 日
0.1.0 2024 年 2 月 18 日

Rust 模式 中排名第 848

MIT/Apache

18KB
384

ex_em_ell

ex_em_ell 是一个基于出色的 xml-rs 库的具有观点的 XML 库。它提供从/to 特性和 derive 宏,以减少使用底层库时所需的样板代码。

项目状态

该项目目前处于 alpha 阶段,API 预计在达到 1.x.y 版本之前会经历几轮迭代。在其当前状态下,它是基于特定项目需求而非特定路线图进行开发的。

目的

如上所述,ex_eml_ell 是一个具有观点的库,它导致没有其他库完全符合特定的利基用例。如果那些库符合您的用例,它们可能比这个项目更加完善和精致,所以我们建议您使用它们。

可出错解析

在编写此库时,许多适合我们用例的解析器要求您的类型实现 Default,并且会自动用默认值填充您的类型的实例。我们需要一个能够

  • 在缺少必需字段时失败
  • 生成可以用于跟踪 XML 结构中缺少的字段的精确路径的错误消息(例如,data > components > 1 > component 缺少 "name" 字段 比仅 expected "name" field 的错误消息更有助于用户)

不基于 Serde 构建

由于XML超出了serde设计的常规模式,尝试与serde集成的库会使用诸如#[serde(rename = "@attribute")这样的东西来指定用于读取/写入文档的特定XML结构。这在仅用于XML的类型的情况下很有用,但我们的用例需要类型能够解析XML和JSON文档。我们使用serde处理JSON,并使用这个库处理XML

使用方法

该crate提供了一些特性和相应的derive宏。其中最值得注意的是FromXmlDocument/ToXmlDocumentFromXmlElement/ToXmlElement。具有以下定义的结构体将对应以下XML:

#[derive(ex_em_ell::FromXmlDocument, ex_em_ell::ToXmlDocument)]
struct Example {
    #[ex_em_ell(rename = "type")]
    example_type: String,

    child: ExampleChild,
}

#[derive(ex_em_ell::FromXmlElement, ex_em_ell::ToXmlElement)]
struct ExampleChild {
    field: String,
}

...

<example>
  <type>example value</type>
  <child>
    <field>example field value</field>
  </child>
</example>

许可证

本项目采用MIT许可证或Apache-2.0许可证的双重许可方式。这是为了与更广泛的Rust社区兼容。

依赖关系

~1–1.6MB
~33K SLoC