17 个版本 (11 个重大更新)
0.12.0 | 2024年8月12日 |
---|---|
0.11.1 | 2024年6月23日 |
0.10.1 | 2024年6月8日 |
0.10.0 | 2024年3月16日 |
0.3.0 | 2021年6月26日 |
#429 在 解析器实现
67,468 每月下载量
用于 31 个crate (3 个直接使用)
435KB
12K SLoC
rxml
— 限制性、最小化 XML 1.0 解析器
此crate提供具有命名空间的XML 1.0文档的“限制性”解析。
功能(有些人称之为限制)
- 无外部资源
- 无自定义实体
- 无任何DTD
- 无处理指令
- 无注释
- 仅支持UTF-8
- 强制命名空间良好性
- 仅支持XML 1.0
- 流式解析(解析器发出SAX事件的子集)
- 流式编码
- 解析器可基于推拉模式驱动
- 通过
async
功能和AsyncReader
支持基于tokio
的异步性。
示例
从字节数组解析数据
要从字节数组(或一系列字节数组)解析XML文档,您可以直接使用具有 Parse
特性的 Parser
。
use rxml::{Parser, Parse, Error, Event, XmlVersion};
use std::io;
let mut doc = &b"<?xml version='1.0'?><hello>World!</hello>"[..];
let mut fp = Parser::new();
while doc.len() > 0 {
let ev = fp.parse(&mut doc, true); // true = doc contains the entire document
println!("got event: {:?}", ev);
}
从标准库读取器解析数据
要从 std::io::BufRead
结构解析XML文档,您可以使用 Reader
。
# use std::io::BufReader;
# let file = &mut &b"<?xml version='1.0'?><hello>World!</hello>"[..];
// let file = std::fs::File::open(..).unwrap();
let reader = BufReader::new(file);
let mut reader = rxml::Reader::new(reader);
let result = rxml::as_eof_flag(reader.read_all(|ev| {
println!("got event: {:?}", ev);
}));
assert_eq!(result.unwrap(), true); // true indicates eof
使用 tokio
解析
要从 tokio::io::AsyncBufRead
结构解析XML文档,您可以使用 AsyncReader
。
这需要 tokio
功能。
# use tokio::io::AsyncRead;
use rxml::{AsyncReader, Error, Event, XmlVersion};
# tokio_test::block_on(async {
# let sock = &mut &b"<?xml version='1.0'?><hello>World!</hello>"[..];
// let sock = ..;
let reader = tokio::io::BufReader::new(sock);
// this converts the doc into an tokio::io::AsyncRead
let mut reader = AsyncReader::new(reader);
// we expect the first event to be the XML declaration
let ev = reader.read().await;
assert!(matches!(ev.unwrap().unwrap(), Event::XmlDeclaration(_, XmlVersion::V1_0)));
# })
功能标志
macros
:启用宏,将&str
转换为&NameStr
、&NcNameStr
和&CDataStr
分别。compact_str
(默认):启用对某些字符串类型的compact_str
的使用,以避免分配并节省堆内存。tokio
(默认):启用AsyncReader
和相关类型。stream
:向AsyncReader
添加futures::Stream
实现。隐含tokio
。shared_ns
:允许在解析器和跨解析器之间消除命名空间 URI 的重复。
依赖项
~2.1–3.5MB
~54K SLoC