錆は、シリアライズコードを自動的に生成する(デ)ための優れたサポートをしています。非常に小さなセットアップを必要とする従来のrustc-serialize
があります。次に、多くのフォーマットと詳細なカスタム設定が可能な完全に新しい(デ)シリアライゼーションフレームワークであるが、もう少し初期設定が必要なserde
クレートがあります。
serde
+ serde_xml_rs
を使用してXMLをRust-structsに逆シリアル化する方法を説明します。
は、我々は、手動でデシリアライズコードを実装することができますか、私たちはserde_derive
クレートを使用して自動的に生成することができ、あなたのCargo.toml
に木箱を追加します。
[dependencies]
serde_derive = "1.0"
serde = "1.0"
serde_xml_rs = "0.2.0"
Serdeがあなたの構造体について知っている必要があり、あなたの構造体に注釈を追加します。それを助け、プロジェクト内のすべての単一構造体のコードを生成しないためには、必要な構造体に注釈を付ける必要があります。 Debug
派生型はprintln!
で構造体を簡単に印刷して、すべてが機能しているかどうかを調べることができます。 Deserialize
バインドは、コードを生成するようにserde
に通知するものです。 xmlタグの内容をテキストとして扱う場合は、テキストを含むフィールドの名前を "rename"に変更して$value
にする必要があります。 $value
という名前は、serde_xml_rs
枠の作成では非常に任意に行われましたが、フィールド名には$
記号を含めることができないため、実際のフィールドと決して衝突することはありません。
#[macro_use]
extern crate serde_derive;
extern crate serde;
extern crate serde_xml_rs;
#[derive(Deserialize, Debug)]
struct Note {
name: String,
body: Body,
}
#[derive(Deserialize, Debug)]
struct Body {
name: String,
#[serde(rename="layer")]
layers: Vec<Layer>,
}
#[derive(Deserialize, Debug)]
struct Layer {
content_type: String,
count: u8,
data: Vec<Data>,
}
#[derive(Deserialize, Debug)]
struct Data {
id: u8,
#[serde(rename="$value")]
content: String,
}
今、簡単な部分が来るオブジェクト
にXMLを含む文字列を回し
。文字列にserde_xml::from_str
と呼び出し、エラーまたは値Node
を取得します。
fn main() {
let note: Note = serde_xml_rs::deserialize(r##"
<?xml version="1.0" encoding="UTF-8"?>
<note name="title">
<body name="main_body">
<layer content_type="something" count="99">
<data id="13">
Datacontent
</data>
</layer>
</body>
</note>
"##.as_bytes()).unwrap();
println!("{:#?}", note);
}