#deserializer #reader #derive-debug #string #deserialize #serde-derive #serde-xml-rs

tobz1000-serde-xml-rs

serde-xml-rs的伪命名空间分支

2个版本

使用旧的Rust 2015

0.4.1-tobz1000-12021年1月24日

#1913 in 编码


3 个crate中使用 (via odata_client_codegen)

MIT 许可证

50KB
1K SLoC

serde-xml-rs

Build Status

基于xml-rs的Serde反序列化器(兼容0.9+)

用法

对于实现了 std::io::Read 的任何类型,使用 serde_xml_rs::from_reader(...) 如下所示

#[macro_use]
extern crate serde_derive;
extern crate serde;
extern crate serde_xml_rs;

use serde_xml_rs::from_reader;

#[derive(Debug, Deserialize)]
struct Item {
    pub name: String,
    pub source: String
}

#[derive(Debug, Deserialize)]
struct Project {
    pub name: String,

    #[serde(rename = "Item", default)]
    pub items: Vec<Item>
}

fn main() {
    let s = r##"
        <Project name="my_project">
            <Item name="hello" source="world.rs" />
        </Project>
    "##;
    let project: Project = from_reader(s.as_bytes()).unwrap();
    println!("{:#?}", project);
}

或者,您可以使用 serde_xml_rs::Deserializer 从预先配置的 xml_rs::EventReader 创建反序列化器。

解析标签的“值”

如果您有一个如下形式的输入 <foo abc="xyz">bar</foo>,并且您想访问 bar,您可以使用特殊名称 $value

struct Foo {
    pub abc: String,
    #[serde(rename = "$value")]
    pub body: String,
}

解析表示

反序列化器试图尽可能直观。

然而,在某些边缘情况下,您可能会收到意外的错误,因此最好查看 tests 以满足预期。

依赖关系

~0.7–1.4MB
~30K SLoC