13 个版本 (重大更改)

0.11.0 2023 年 12 月 16 日
0.10.0 2023 年 11 月 22 日
0.3.0 2023 年 2 月 17 日
0.2.0 2022 年 3 月 21 日
0.1.0 2020 年 10 月 9 日

#1819 in 解析器实现

Download history 54/week @ 2024-04-01 13/week @ 2024-04-15 12/week @ 2024-04-22 12/week @ 2024-04-29 7/week @ 2024-05-06 1/week @ 2024-05-13 45/week @ 2024-05-20 16/week @ 2024-05-27 36/week @ 2024-06-03 54/week @ 2024-06-10 72/week @ 2024-06-17 76/week @ 2024-06-24 20/week @ 2024-07-01 15/week @ 2024-07-08 11/week @ 2024-07-15

每月 142 次下载
3 个包中使用了(2 个直接使用)

MIT/Apache 许可

170KB
4.5K SLoC

MaybeXml

MaybeXml 是一个用于扫描和评估类似 XML 数据的令牌的库。实际上,该库提供了一个非验证解析器。其接口与许多 XML 拉伸解析器类似。

目的

该库的目的是提供一种读取 XML 文档的方法,包括办公套件文档、RSS/Atom 源、配置文件、SVG 和 Web 服务消息。

示例

使用 tokenize()

use maybe_xml::{Reader, token::{Characters, EndTag, StartTag, Ty}};

let input = "<id>123</id>";

let reader = Reader::from_str(input);
let mut pos = 0;

let token = reader.tokenize(&mut pos);
if let Some(Ty::StartTag(tag)) = token.map(|t| t.ty()) {
    assert_eq!("id", tag.name().local().as_str());
    assert_eq!(None, tag.name().namespace_prefix());
} else {
    panic!();
}
assert_eq!(4, pos);

let token = reader.tokenize(&mut pos);
if let Some(Ty::Characters(chars)) = token.map(|t| t.ty()) {
    assert_eq!("123", chars.content().as_str());
} else {
    panic!();
}
assert_eq!(7, pos);

let token = reader.tokenize(&mut pos);
if let Some(Ty::EndTag(tag)) = token.map(|t| t.ty()) {
    assert_eq!("</id>", tag.as_str());
    assert_eq!("id", tag.name().local().as_str());
} else {
    panic!();
}
assert_eq!(12, pos);

let token = reader.tokenize(&mut pos);
assert_eq!(None, token);

// Verify that `pos` is equal to `input.len()` to ensure all data was
// processed.

使用 Iterator 功能

use maybe_xml::{Reader, token::Ty};

let input = "<id>123</id><name>Jane Doe</name>";

let reader = Reader::from_str(input);
let mut iter = reader.into_iter().filter_map(|token| {
    match token.ty() {
        Ty::StartTag(tag) => Some(tag.name().as_str()),
        _ => None,
    }
});

let name = iter.next();
assert_eq!(Some("id"), name);

let name = iter.next();
assert_eq!(Some("name"), name);

assert_eq!(None, iter.next());

安装

cargo add maybe_xml

默认情况下,启用了 std 功能。

仅分配

如果宿主环境有分配器,但没有访问 Rust std 库的权限

cargo add --no-default-features --features alloc maybe_xml

无分配器/仅核心

如果宿主环境没有分配器

cargo add --no-default-features maybe_xml

许可

根据您的选择,许可协议为 Apache License, Version 2.0MIT License

贡献

除非您明确声明,否则任何有意提交以包含在作品中的贡献,根据 Apache-2.0 许可证定义,均应按上述方式双许可,不附加任何额外条款或条件。

无运行时依赖