High performance xml pull reader/writer.
Syntax is inspired by xml-rs.
toml
[dependencies]
quick-xml = "0.5.0"
rust
extern crate quick_xml;
```rust use quick_xml::{XmlReader, Event};
let xml = r#"XmlReader
// to an XmlnsReader
:
// let readerns = reader.namespaced();
let mut count = 0;
let mut txt = Vec::new();
for r in reader {
// namespaced: the for
loop moves the reader
// => use while let
so you can have access to reader_ns.resolve
for attributes
// while let Some(r) = reader.next() {
match r {
Ok(Event::Start(ref e)) => {
// for namespaced:
// Ok((ref namespacevalue, Event::Start(ref e)))
match e.name() {
b"tag1" => println!("attributes values: {:?}",
e.attributes().map(|a| a.unwrap().1)
// namespaced: use reader_ns.resolve
// e.attributes().map(|a| a.map(|(k, _)| readerns.resolve(k))) ...
.collect::
```rust use quickxml::{AsStr, Element, Event, XmlReader, XmlWriter}; use quickxml::Event::*; use std::io::Cursor; use std::iter;
let xml = r#"
// copy existing attributes, adds a new my-key="some value" attribute
let mut elem = Element::new("my_elem").with_attributes(attrs);
elem.push_attribute(b"my-key", "some value");
// writes the event to the writer
assert!(writer.write(Start(elem)).is_ok());
},
Ok(Event::End(ref e)) if e.name() == b"this_tag" => {
assert!(writer.write(End(Element::new("my_elem"))).is_ok());
},
Ok(e) => assert!(writer.write(e).is_ok()),
Err((e, pos)) => panic!("{:?} at position {}", e, pos),
}
}
let result = writer.intoinner().intoinner();
let expected = r#"
``` // quick-xml benches test benchquickxml ... bench: 1,772,803 ns/iter (+/- 21,071) test benchquickxmlescaped ... bench: 2,048,106 ns/iter (+/- 20,597) test benchquickxmlnamespaced ... bench: 2,585,081 ns/iter (+/- 28,941)
// same bench with xml-rs test benchxmlrs ... bench: 39,683,007 ns/iter (+/- 533,863) ```
Any PR is welcomed!
MIT