Почему при десериализации XML с помощью serde-xml-rs появляется сообщение об ошибке «Отсутствует поле», даже если элемент присутствует?

У меня есть следующий XML-файл

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<project name="project-name">
    <libraries>
        <library groupId="org.example" artifactId="&lt;name&gt;" version="0.1"/>
        <library groupId="com.example" artifactId="&quot;cool-lib&amp;" version="999"/>
    </libraries>
</project>

Я хочу десериализовать его с помощью serde-xml-rs в эту иерархию структур:

#[derive(Deserialize, Debug)]
struct Project {
    name: String,
    libraries: Libraries
}

#[derive(Deserialize, Debug)]
struct Libraries {
    libraries: Vec<Library>,
}

#[derive(Deserialize, Debug)]
struct Library {
    groupId: String,
    artifactId: String,
    version: String,
}

Я пытаюсь прочитать из файла, используя приведенный ниже код.

let file = File::open("data/sample_1.xml").unwrap();
let project: Project = from_reader(file).unwrap();

Я получаю сообщение об ошибке "отсутствует поле libraries":

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error(Custom("missing field `libraries`"), State { next_error: None, backtrace: None })', src/libcore/result.rs:997:5
note: Run with `RUST_BACKTRACE=1` environment variable to display a backtrace.

person joydeep bhattacharjee    schedule 16.04.2019    source источник
comment
Посмотрев на страницу вашего профиля здесь, на SO, я заметил, что вы редко принимаете ответы. Вы должны подумать об этом (в будущем и ваши вопросы, которые вы уже задавали). Вы можете сделать это, щелкнув галочку рядом с ответом. Это делает две вещи. Это позволяет всем узнать, что ваша проблема была решена к вашему удовлетворению, и дает человеку, который помогает вам, за помощь (также вы получаете +2 репутации за принятый вопрос). См. здесь для получения полного объяснения.   -  person hellow    schedule 17.04.2019


Ответы (1)


Следуя примеру в репозитории GitHub, вам не хватает аннотации:

#[derive(Deserialize, Debug)]
struct Libraries {
    #[serde(rename = "library")]
    libraries: Vec<Library>
}

Благодаря этому я получаю правильное десериализованное представление вашего файла XML.

project = Project {
    name: "project-name",
    libraries: Libraries {
        libraries: [
            Library {
                groupId: "org.example",
                artifactId: "<name>",
                version: "0.1"
            },
            Library {
                groupId: "com.example",
                artifactId: "\"cool-lib&",
                version: "999"
            }
        ]
    }
}
person hellow    schedule 16.04.2019