4 个版本 (2 个破坏性版本)
0.3.0 | 2020 年 3 月 8 日 |
---|---|
0.2.0 | 2020 年 3 月 8 日 |
0.1.1 | 2015 年 4 月 3 日 |
0.1.0 | 2015 年 4 月 1 日 |
#2270 在 解析器实现 中
44,087 每月下载量
用于 77 个 道具 (16 个直接使用)
57KB
1.5K SLoC
RustyXML
RustyXML 是一个基于 Rust 编写的命名空间感知 XML 解析器。目前它提供了一个基本的类似 SAX 的 API,以及基于此的 ElementBuilder。
解析器本身是从 ObjFW 中的 OFXMLParser 派生出来的,如 [ObjFW](https://webkeks.org/objfw/) 所示。
当前的限制包括
- 不完整的错误检查
- 不稳定的 API
本项目跟踪 Rust 稳定版。
示例
将字符串解析为 Element
结构体
use xml::Element;
let elem: Option<Element> = "<a href='//example.com'/>".parse();
从解析字符串数据中获取事件
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),
_ => ()
}
}
这应该打印
<a>
</a>
从 Parser
Event
中构建 Element
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),
}
}
手动构建 Element
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());
结果(添加了一些空白以提高可读性)
<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>
许可
许可协议为以下之一
- Apache 许可证 2.0 版 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确说明,否则您有意提交的任何贡献,根据 Apache-2.0 许可证定义,应作为上述双许可发布,无需任何附加条款或条件。