Как десериализовать XML в различные структуры, основанные на имени тега, используя serde_xml_rs? - PullRequest
0 голосов
/ 17 марта 2019

Я использую serde-xml-rs для простой передачи информации, которую я или кто-либо другой могу изменить позже без необходимости кодировать в Rust.

Это выглядит примерно так:

<?xml version="1.0" encoding="UTF-8" ?>
<root>
    <mass>1</mass>
    <pole_radius>1</pole_radius>
    <eq_radius>1</eq_radius>
    <atmos_n2>1</atmos_n2>
    <atmos_o2>1</atmos_o2>
    <atmos_ar>1</atmos_ar>
    <atmos_co2>1</atmos_co2>
    <atmos_ne>1</atmos_ne>
    <atmos_he>1</atmos_he>
    <atmos_ch4>1</atmos_ch4>
    <atmos_h20>1</atmos_h20>
</root>

Что работает, но это некрасиво и много чего нужно. Я хочу, чтобы это было больше похоже на это:

<?xml version="1.0" encoding="UTF-8" ?>
<root>
    <planetary>
        <mass>1</mass>
        <pole_radius>1</pole_radius>
        <eq_radius>1</eq_radius>
    </planetary>
    <atmos>
        <n2>1</n2>
        <o2>1</o2>
        <!-- slimmed it down so that it saves space for this post -->
    <atmos>
</root>

Я не уверен, как использовать serde_xml_rs для работы с этой системой. Вот как это настроено прямо сейчас, и это работает, когда он читает первый фрагмент XML:

extern crate serde;
#[macro_use]
extern crate serde_derive;
extern crate serde_xml_rs;

use std::fs::File;
use std::io::Read;

#[derive(Serialize, Deserialize)]
struct LevelData {
    mass: f64,
    // more here, again slimmed for the post
}

fn init() {
    let mut file = File::open("Level.xml").unwrap();
    let mut buff = String::new();
    file.read_to_string(&mut buff).unwrap();
    let level_data: LevelData = serde_xml_rs::from_str(&buff).unwrap();
}
fn main() {
    init();
}

1 Ответ

3 голосов
/ 17 марта 2019

Обычно вы делаете это, отражая ту же структуру данных в ваших типах Rust:

#[derive(Serialize, Deserialize)]
struct LevelData {
    planetary: PlanetaryData,
}

#[derive(Serialize, Deserialize)]
struct PlanetaryData {
    mass: f64,
}
...