#xml-parser #xml #xml-document #namespaces #xml-data #minimalist #events

rxml

最小化、限制性 XML 1.0 解析器,不包括危险的 XML 功能

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

Download history 12860/week @ 2024-05-01 11822/week @ 2024-05-08 12204/week @ 2024-05-15 11905/week @ 2024-05-22 15810/week @ 2024-05-29 16391/week @ 2024-06-05 15184/week @ 2024-06-12 13737/week @ 2024-06-19 11887/week @ 2024-06-26 11641/week @ 2024-07-03 12482/week @ 2024-07-10 14158/week @ 2024-07-17 14713/week @ 2024-07-24 20184/week @ 2024-07-31 17781/week @ 2024-08-07 12085/week @ 2024-08-14

67,468 每月下载量
用于 31 个crate (3 个直接使用)

MIT 许可证

435KB
12K SLoC

rxml — 限制性、最小化 XML 1.0 解析器

此crate提供具有命名空间的XML 1.0文档的“限制性”解析。

crate badge docs badge

功能(有些人称之为限制)

  • 无外部资源
  • 无自定义实体
  • 无任何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