我正在使用serde-xml-rs
crate 构建一个 rust 中的 xml 解析器。我有一些 XML,看起来像这样:
<CharacterStyleRange>
<Properties>
<SomeProperty>value</SomeProperty>
</Properties>
<Content>First line</Content>
<Br />
<Content>Second line</Content>
<Br />
<Content>Third line</Content>
</CharacterStyleRange>
由于和的顺序<Content>
很<Br\>
重要,我试图通过以下方式将其解析为枚举向量:
#[derive(Default,Deserialize,Debug)]
#[serde(rename_all="PascalCase")]
pub struct CharacterStyleRange {
properties: Option<Properties>,
#[serde(alias="Content", alias="Br")]
contents: Option<Vec<ContentOrLineBreak>>
}
#[derive(Deserialize,Debug)]
enum ContentOrLineBreak {
Content(Content),
Br(Br)
}
#[derive(Default,Deserialize,Debug)]
#[serde(rename_all="PascalCase")]
pub struct Content {
#[serde(rename="$value")]
text: String,
}
#[derive(Default,Deserialize,Debug)]
pub struct Br {
text: String,
}
我期望得到一个有点像这样的结构:
CharacterStyleRange {
properties: Some(Property{
SomeProperty: value
}),
contents: Some(Vec<
ContentOrLineBreak::Content(
Content{ text: "First line" }
),
ContentOrLineBreak::Br(
Br{ text="" }
),
ContentOrLineBreak::Content(
Content{ text: "Second line" }
),
ContentOrLineBreak::Br(
Br{ text="" }
),
ContentOrLineBreak::Content(
Content{ text: "Third line" }
),
>)
}
但是,我收到以下错误:
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Custom { field: "unknown variant `First line`, expected `Content` or `Br`" }'
这种方法是否只能使用派生的 serde 反序列化函数?或者我应该制作一个自定义函数来解析这个结构?
我也在考虑将<Br/>
xml 中的元素更改为<Content><Br/></Content>
在解析之前,以便一起避免这个问题。