Expand description
Convert roxmltree documents into [serde]-compatible types
Owned types can be deserialized directly from XML text using from_str:
use serde::Deserialize;
use serde_roxmltree::from_str;
#[derive(Deserialize)]
struct Record {
field: String,
}
let record = from_str::<Record>("<record><field>foobar</field></record>")?;
assert_eq!(record.field, "foobar");Borrowing types must be deserialized from a Document using from_doc:
use roxmltree::Document;
use serde::Deserialize;
use serde_roxmltree::from_doc;
#[derive(Deserialize)]
struct Record<'a> {
field: &'a str,
}
let document = Document::parse("<document><field>foobar</field></document>")?;
let record = from_doc::<Record>(&document)?;
assert_eq!(record.field, "foobar");Subtrees can be captured from the source by enabling the raw-node feature and using the RawNode type.
Fields of structures map to child elements and attributes:
use serde::Deserialize;
use serde_roxmltree::from_str;
#[derive(Deserialize)]
struct Record {
child: String,
attribute: i32,
}
let record = from_str::<Record>(r#"<record attribute="42"><child>foobar</child></record>"#)?;
assert_eq!(record.child, "foobar");
assert_eq!(record.attribute, 42);Sequences collect repeated child elements:
use serde::Deserialize;
use serde_roxmltree::from_str;
#[derive(Deserialize)]
struct Record {
field: Vec<String>,
}
let record = from_str::<Record>("<record><field>foo</field><field>bar</field></record>")?;
assert_eq!(record.field, ["foo", "bar"]);Enum variants describe alternatives:
use serde::Deserialize;
use serde_roxmltree::from_str;
#[derive(Debug, PartialEq, Deserialize)]
#[serde(rename_all = "lowercase")]
enum Record {
Float(f32),
Integer(i32),
}
let record = from_str::<Record>("<record><float>42.0</float></record>")?;
assert_eq!(record, Record::Float(42.0));
let record = from_str::<Record>("<record><integer>23</integer></record>")?;
assert_eq!(record, Record::Integer(23));The reserved name #content is used to flatten one level of the hierarchy and
revisit those nodes and attributes as if embedded inside another struct. This can
useful to handle inner text:
use serde::Deserialize;
use serde_roxmltree::from_str;
#[derive(Deserialize)]
struct Record {
child: Child,
}
#[derive(Deserialize)]
struct Child {
#[serde(rename = "#content")]
text: String,
attribute: i32,
}
let record = from_str::<Record>(r#"<record><child attribute="42">foobar</child></record>"#)?;
assert_eq!(record.child.text, "foobar");
assert_eq!(record.child.attribute, 42);or partial alternatives:
use serde::Deserialize;
use serde_roxmltree::from_str;
#[derive(Debug, PartialEq, Deserialize)]
#[serde(rename_all = "lowercase")]
enum Alternative {
Float(f32),
Integer(i32),
}
#[derive(Debug, PartialEq, Deserialize)]
struct Record {
#[serde(rename = "#content")]
alternative: Alternative,
string: String,
}
let record = from_str::<Record>("<record><float>42.0</float><string>foo</string></record>")?;
assert_eq!(record.alternative, Alternative::Float(42.0));
assert_eq!(record.string, "foo");
let record = from_str::<Record>("<record><integer>23</integer><string>bar</string></record>")?;
assert_eq!(record.alternative, Alternative::Integer(23));
assert_eq!(record.string, "bar");Optionally, attribute names can be prefixed by @ to distinguish them from tag names:
use serde::Deserialize;
use serde_roxmltree::{defaults, from_str, Options};
#[derive(Deserialize)]
struct Record {
child: String,
#[serde(rename = "@attribute")]
attribute: i32,
}
let record = defaults().prefix_attr().from_str::<Record>(r#"<record attribute="42"><child>foobar</child></record>"#)?;
assert_eq!(record.child, "foobar");
assert_eq!(record.attribute, 42);Support for namespaces can be enabled via the namespaces option:
use serde::Deserialize;
use serde_roxmltree::{defaults, from_str, Options};
let text = r#"<record xmlns:foo="http://foo" xmlns:bar="http://bar">
<foo:qux>23</foo:qux>
<bar:qux>42</bar:qux>
</record>"#;
#[derive(Deserialize)]
struct SomeRecord {
qux: Vec<i32>,
}
let record = from_str::<SomeRecord>(text)?;
assert_eq!(record.qux, [23, 42]);
#[derive(Deserialize)]
struct AnotherRecord {
#[serde(rename = "{http://foo}qux")]
some_qux: i32,
#[serde(rename = "{http://bar}qux")]
another_qux: i32,
}
let record = defaults().namespaces().from_str::<AnotherRecord>(text)?;
assert_eq!(record.some_qux, 23);
assert_eq!(record.another_qux, 42);Re-exports§
pub use roxmltree;
Structs§
- RawNode
- Captures subtrees from the source
Enums§
Traits§
- Options
- Types that represent a set of options
Functions§
- defaults
- The default set of options
- from_
doc - Deserialize an instance of type
Tfrom aroxmltree::Document - from_
node - Deserialize an instance of type
Tfrom aroxmltree::Node - from_
str - Deserialize an instance of type
Tdirectly from XML text