commit | 0f29f1ca9853454abe4982e373a9edd63d508030 | [log] [tgz] |
---|---|---|
author | Jooyung Han <jooyung@google.com> | Fri Jul 16 04:44:09 2021 +0000 |
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | Fri Jul 16 04:44:09 2021 +0000 |
tree | 33bde6c515a7bd7b50de72cedb31a280a14d37a1 | |
parent | 383e07c94f7adbde4ef8977c1276074a657159f7 [diff] | |
parent | 55929c6337c1fa011be5040c585baacf59279f21 [diff] |
Revert^2 "Import serde-xml-rs 0.4.1" am: e736ffebad am: 1364b8b5cb am: 55929c6337 Original change: https://android-review.googlesource.com/c/platform/external/rust/crates/serde-xml-rs/+/1769187 Change-Id: If883a4deb5f5b84f7c20c026ec22f8c5ac2f82ed
xml-rs based deserializer for Serde (compatible with 0.9+)
Use serde_xml_rs::from_reader(...)
on any type that implements std::io::Read
as following:
#[macro_use] extern crate serde_derive; extern crate serde; extern crate serde_xml_rs; use serde_xml_rs::from_reader; #[derive(Debug, Deserialize)] struct Item { pub name: String, pub source: String } #[derive(Debug, Deserialize)] struct Project { pub name: String, #[serde(rename = "Item", default)] pub items: Vec<Item> } fn main() { let s = r##" <Project name="my_project"> <Item name="hello" source="world.rs" /> </Project> "##; let project: Project = from_reader(s.as_bytes()).unwrap(); println!("{:#?}", project); }
Alternatively, you can use serde_xml_rs::Deserializer
to create a deserializer from a preconfigured xml_rs::EventReader
.
If you have an input of the form <foo abc="xyz">bar</foo>
, and you want to get at thebar
, you can use the special name $value
:
struct Foo { pub abc: String, #[serde(rename = "$value")] pub body: String, }
Deserializer tries to be as intuitive as possible.
However, there are some edge cases where you might get unexpected errors, so it's best to check out tests
for expectations.