Crates.io | RustyXML |
lib.rs | RustyXML |
version | 0.3.0 |
source | src |
created_at | 2015-04-01 02:01:23.597082 |
updated_at | 2020-03-08 18:56:08.987495 |
description | A SAX-like streaming XML parser, and a DOM-like interface based on that |
homepage | https://github.com/Florob/RustyXML |
repository | https://github.com/Florob/RustyXML |
max_upload_size | |
id | 1751 |
size | 72,290 |
RustyXML is a namespace aware XML parser written in Rust. Right now it provides a basic SAX-like API, and an ElementBuilder based on that.
The parser itself is derived from OFXMLParser as found in ObjFW https://webkeks.org/objfw/.
The current limitations are:
This project tracks Rust stable.
Parse a string into an Element
struct:
use xml::Element;
let elem: Option<Element> = "<a href='//example.com'/>".parse();
Get events from parsing string data:
use xml::{Event, Parser};
// Create a new Parser
let mut p = Parser::new();
// Feed data to be parsed
p.feed_str("<a href");
p.feed_str("='//example.com'/>");
// Get events for the fed data
for event in p {
match event.unwrap() {
Event::ElementStart(tag) => println!("<{}>", tag.name),
Event::ElementEnd(tag) => println!("</{}>", tag.name),
_ => ()
}
}
This should print:
<a>
</a>
Build Element
s from Parser
Event
s:
use xml::{Parser, ElementBuilder};
let mut p = xml::Parser::new();
let mut e = xml::ElementBuilder::new();
p.feed_str("<a href='//example.com'/>");
for elem in p.filter_map(|x| e.handle_event(x)) {
match elem {
Ok(e) => println!("{}", e),
Err(e) => println!("{}", e),
}
}
Build Element
s by hand:
let mut reply = xml::Element::new("iq".into(), Some("jabber:client".into()),
vec![("type".into(), None, "error".into()),
("id".into(), None, "42".into())]);
reply.tag(xml::Element::new("error".into(), Some("jabber:client".into()),
vec![("type".into(), None, "cancel".into())]))
.tag_stay(xml::Element::new("forbidden".into(),
Some("urn:ietf:params:xml:ns:xmpp-stanzas".into()),
vec![]))
.tag(xml::Element::new("text".into(),
Some("urn:ietf:params:xml:ns:xmpp-stanzas".into()),
vec![]))
.text("Permission denied".into());
Result (some whitespace added for readability):
<iq xmlns='jabber:client' id='42' type='error'>
<error type='cancel'>
<forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
<text xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'>Permission denied</text>
</error>
</iq>
Licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.