4

我正在使用serde-xml-rscrate 构建一个 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>在解析之前,以便一起避免这个问题。

4

0 回答 0