2016-06-22 54 views
9

XMLファイルを先に定義したRust構造体に読み込むプログラムを作成しようとしています。現在最も人気のあるXMLライブラリのように見えるので、私はxml-rsXMLファイルを構造体に読み込む

struct Note { 
    name: String, 
    Body: Body 
} 

struct Body { 
    name: String, 
    layers: Vec<Layer>, 
} 

struct Layer { 
    content_type: String, 
    count: u8, 
    data: Vec<Data>, 
} 

struct Data { 
    id: u8, 
    // Datacontent? 
} 

:この中へ

<?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> 

:このような

何か。錆に慣れていないので、私はこの作業をどのように実行するかを考え出すのが難しいです。

答えて

14

錆は、シリアライズコードを自動的に生成する(デ)ための優れたサポートをしています。非常に小さなセットアップを必要とする従来の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); 
} 

関連する問題