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 解析器实现
每月 142 次下载
在 3 个包中使用了(2 个直接使用)
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.0 或 MIT License。
贡献
除非您明确声明,否则任何有意提交以包含在作品中的贡献,根据 Apache-2.0 许可证定义,均应按上述方式双许可,不附加任何额外条款或条件。