无法使用带有 serde-xml-rs 的可选元素解析 XML

Failed to parse XML with an optional element with serde-xml-rs

我有一棵带 serde 注释的结构树,它成功解析了样本 XML,包括这个片段:

<bmsg>
    <cmsg>
         <!-- ... -->
    <cmsg>
<bmsg>

现在我正在测试一个大样本 XML 文件,以下结构失败,因为有时 <cmsg>..</cmsg> 会丢失。我正在反序列化这个使用:

#[derive(Serialize,Deserialize, Debug)]
struct A {  
    #[serde(rename="bmsg")]
    messages: B,                 // <====
}

#[derive(Serialize,Deserialize, Debug)]
struct B {  // bmsg
    #[serde(rename="cmsg")]
    list: Vec<C>,
}

导致第二个结构出错:

panicked at 'called `Result::unwrap()` on an `Err` value: missing field `cmsg`

我将第一个结构更改为具有 Vec<> 以便它可以处理可选元素:

#[derive(Serialize,Deserialize, Debug)]
struct A {  
    #[serde(rename="bmsg")]
    messages: Vec<B>,            // <====
}

#[derive(Serialize,Deserialize, Debug)]
struct B {  // bmsg
    #[serde(rename="cmsg")]
    list: Vec<C>,
}

但是 serde 继续给出同样的错误。我也试过 Option<>,但没有成功。

最让我困惑的是我到处都使用 Vec<> 而从来没有 运行 进入这个问题。

看起来Option<T>表示该项目确实存在,只是没有内容。

The documentation seems to suggest using the default attribute, to tell the deserializer to use the implementation of the Default trait 类型如果找不到

考虑到这一点,也许这对你有用:

#[derive(Serialize,Deserialize, Debug)]
struct A {  
    #[serde(rename = "bmsg")]
    messages: B,
}

#[derive(Serialize,Deserialize, Debug)]
struct B {  // bmsg
    #[serde(rename = "cmsg", default)] // <----- use default to call `Default::default()` against this vector
    list: Vec<C>,
}

您可以找到 the code I used to check this in the Playground。它不会在 Playground 中 运行,但会在本地 运行ning 产生您预期的结果。