gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:20:59 24 4
gpt4 key购买 nike

我有一个带有 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 default属性,告诉反序列化器使用 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 中运行,但会产生您在本地运行的预期结果。

关于xml - 无法使用 serde-xml-rs 解析带有可选元素的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46674893/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com