#xml-parser #xml #parser #streaming-parser #xml-element #string #events

RustyXML

一个类似 SAX 的流式 XML 解析器,以及基于此的类似 DOM 的接口

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解析器实现

Download history 21669/week @ 2024-03-14 22066/week @ 2024-03-21 19718/week @ 2024-03-28 27804/week @ 2024-04-04 26502/week @ 2024-04-11 33275/week @ 2024-04-18 33237/week @ 2024-04-25 27661/week @ 2024-05-02 27998/week @ 2024-05-09 29880/week @ 2024-05-16 32649/week @ 2024-05-23 44274/week @ 2024-05-30 45214/week @ 2024-06-06 34429/week @ 2024-06-13 43892/week @ 2024-06-20 34566/week @ 2024-06-27

44,087 每月下载量
用于 77 道具 (16 个直接使用)

MIT/Apache

57KB
1.5K SLoC

RustyXML

Build Status

文档

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 许可证定义,应作为上述双许可发布,无需任何附加条款或条件。

无运行时依赖

特性