如何使用serde从XML属性反序列化数字?

3
我想要从一个XML属性中反序列化一个数字(例如)。
#[macro_use]
extern crate serde_derive;
extern crate serde;
extern crate serde_xml_rs as serde_xml;


#[derive(Deserialize, Debug)]
#[serde(rename = "objects")]
pub struct Objects {
    pub foo: u32
}

fn main() {
    let result_string = r#"<?xml version="1.0" encoding="UTF-8"?>
    <objects foo="42"></objects>"#;
    let deserialized: Objects= serde_xml::deserialize(result_string.as_bytes()).expect("Parse error!");
}

但是执行后,我得到了以下错误

thread 'main' panicked at 'Parse error!: invalid type: string "42", expected u32'

我知道#[serde(deserialize_with="...")]注释,但是是否有更简单的方法,比如使用serde_xml_rs包?


1
没有属性的话,你需要在某种模式中表达类型。但不幸的是,serde_xml_rs 不支持模式或 DTD。 - Peter Hall
也许 Option<u32> 可以处理非数字情况。 - user25064
为什么不在您的反序列化函数中添加 str::parse::<u32> 来将字符串转换为整数? - stevensonmt
1个回答

0

不要使用 0.2.1。在 Cargo.toml 中添加:

serde-xml-rs = { git= "https://github.com/RReverser/serde-xml-rs.git"}

使用来自主分支的serde-xml-rs可以解决这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接