1 个稳定版本
2.0.1 | 2021年1月12日 |
---|---|
1.1.12 |
|
1.1.7 |
|
1.0.4 |
|
在 解析器实现 中排名 2784
每月下载 59 次
用于 7 个crate (3个直接使用)
32KB
320 行
reader for microXml
版本:1.1.12 日期:2020-06-15 作者:Luciano Bestia
microXml 的解析器 - xml 的简化子集
目前有很多 xml 解析器/读取器/标记器/词法分析器,但我需要一个非常小且简单的,用于我的简单的 html 模板在 wasm 中。
我发现了一个标准(或 W3C 建议)对于 MicroXml - 比完整的 Xml 标准简单得多。非常适合我的使用场景:我有一些小型简单的 html 文件,它们兼容 microXml。
microXml
MicroXML 是 XML 的一个子集。它简单得多。
https://www.xml.com/articles/2017/06/03/simplifying-xml-microxml/
https://dvcs.w3.org/hg/microxml/raw-file/tip/spec/microxml.html
MicroXML 实际上是规范良好的 XML。
在 MicroXml 的数据模型中没有 CData、命名空间、声明、处理指令等。
所有这些都可以在规范良好的 microXml 中完成。
<memo lang="en" date="2017-05-01">
I <em>love</em> microXML!<br />
<!-- some comment -->
It's so clean & simple.
</memo>
MicroXml 只能使用 utf-8。我很幸运,因为 Rust 字符串内部是 utf-8,并且会自动检查其正确性。
MicroXml 应该通过规范化:将 CR & CRLF 转换为 LF,但我没有这样做。此外,解码 xml 控制字符 "
,&
... 或解码 Unicode 编码,如 
,
... 并不在读取器中。这留给更高版本的库来决定如何处理。
MicroXml 可以包含注释,但它们不是官方的 microXml 数据。但我在我的模板项目中需要它们。
空白符在文本节点中完全保留。对我来说它们很重要。还有换行符和制表符。这与完整的 Xml 空白符处理不同。
所有其他空白符都被忽略 - 它们是无意义的。
读取器
显然,这个 ReaderForMicroXml 不能读取复杂的完整 XML。
此 reader_for_microxml
用于小的 html 片段。
它们必须是规范良好的 microXml。
这些片段是为了 dodrio 的 html 模板而设计的。
由于片段的大小很小,我可以将所有文本放在内存中的一个字符串中。
只有基本的格式错误会产生错误。我不试图为 microXml 中所有可能的格式错误返回错误。
速度并不是很重要,但代码的大小很重要,因为它将用于WebAssembly。每段代码对于Wasm来说都太大!
该包包含 #![no_std]
,#![forbid(unsafe_code)],无依赖,无分配
迭代器
读取器是一个迭代器。
它实现了迭代器的特异。
使用此语法处理所有令牌
forresult_tokeninreader_iterator{
or
letx: Option<Result<Token,&str>> =reader_iterator.next();
测试
使用cargo运行16个测试
cargomake test
示例
在GitHub仓库中找到示例。
使用
cargomake run_rel1
cargomake run_rel2
这是一个快捷方式,相当于
cargo run --example microxml_tree examples/t2.html
/// read xml and write to screen
use reader_for_microxml::*;
fn main(){
let str_xml = r#"<html>test</html>"#;
let mut reader_iterator = ReaderForMicroXml::new(str_xml);
let result = read_xml_to_debug_string(&mut reader_iterator);
println!("Result: {}", result)
}
fn read_xml_to_debug_string(reader_iterator: &mut ReaderForMicroXml) -> String {
let mut result = String::new();
// reader_iterator is iterator Option<Result<Token,&str>>
// the first option is used for the iterator to know where is the end
// then the Result can have an Token or an Error
for result_token in reader_iterator {
match result_token {
Ok(token) => match token {
Token::StartElement(name) => {
result.push_str(&format!("Start: \"{}\"\n", name));
}
Token::Attribute(name, value) => {
result.push_str(&format!("Attribute: \"{}\" = \"{}\"\n", name, value));
}
Token::TextNode(txt) => {
result.push_str(&format!("Text: \"{}\"\n", txt));
}
Token::Comment(txt) => {
result.push_str(&format!("Comment: \"{}\"\n", txt));
}
Token::EndElement(name) => {
result.push_str(&format!("End: \"{}\"\n", name));
}
},
Err(err_msg) => {
panic!(err_msg);
}
}
}
//return
result
}
用于项目
https://github.com/LucianoBestia/cargo_crev_web
https://github.com/LucianoBestia/dodrio_templating
https://github.com/LucianoBestia/mem6_game
cargo crev reviews and advisory
建议始终使用 cargo-crev
来验证每个依赖的可信度。
请,传播这个信息。
在网上,使用此url来读取包评论。例如
https://web.crev.dev/rust-reviews/crate/num-traits
未来的想法
速度
如果我用Vec
所有其他Unicode字符都是多字节,并且所有这些字节必须以1位开始。
因此,它们不可能被混淆。
https://betterexplained.com/articles/unicode/
https://naveenr.net/unicode-character-set-and-utf-8-utf-16-utf-32-encoding/
参考文献
https://dvcs.w3.org/hg/microxml/raw-file/tip/spec/microxml.html
https://www.xml.com/articles/2017/06/03/simplifying-xml-microxml/
https://github.com/tafia/quick-xml
https://github.com/RazrFalcon/roxmltree