我有一些 XML,它的标签包含多个同名的同级标签,如下所示:
<foo>
<bar/>
<bar/>
</foo>
(也可能有多个顶级<foo>
也是如此,尽管我还没有抽出时间尝试(反)序列化它。)
使用此代码:
use serde::{Deserialize, Serialize};
use quick_xml::de::from_str;
use quick_xml::se::to_string;
#[derive(Debug, Deserialize, PartialEq, Serialize)]
pub struct Foo {
#[serde(rename = "bar", default)]
bars: Vec<Bar>,
}
#[derive(Debug, Deserialize, PartialEq, Serialize)]
#[serde(rename = "bar")]
struct Bar{
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn deserialize_trivial_string_test() {
let fs = "<foo><bar/><bar/></foo>";
let foo = from_str(fs).unwrap();
assert_eq!(Foo { bars: vec![Bar {}, Bar {}] }, foo);
}
#[test]
fn serialize_trivial_string_test() {
let foo = Foo { bars: vec![Bar {}, Bar {}] };
let fs = to_string(&foo).unwrap();
assert_eq!("<foo><bar/><bar/></foo>", fs);
}
}
并且不要忘记激活序列化功能:
[dependencies.quick-xml]
version = "0.18.1"
features = ["serialize"]
我可以很好地反序列化,但序列化增加了额外的<bar>
标记为bars
字段包装实际<bar>
tags:
<Foo>
<bar>
<bar></bar>
<bar></bar>
</bar>
</Foo>
The #[serde(rename = "bar", default)]
on the bars
field 是我第一次尝试解决这个问题,基于fast-xml 的文档 https://crates.io/crates/quick-xml,但显然是行不通的。我还查看了 serde 的文档,确实找到了flatten
属性,但当我尝试将其应用于bars
field.
有什么方法可以获得我需要的序列化,而不需要手动实现Deserialize
?
如果相关的话,我尝试使用的实际数据格式是flam3 文件格式 https://github.com/scottdraves/flam3/wiki/XML-File-Format。有一个示例文件here https://github.com/scottdraves/flam3/blob/master/test.flam3. The <flame>
元素将相当于<foo>
这里,以及<xform>
相当于<bar>
.