#xml #xml-parser #microxml #rust

reader_for_microxml

microXml 的解析器 - xml 的简化子集

1 个稳定版本

2.0.1 2021年1月12日
1.1.12 2020年6月15日
1.1.7 2020年5月30日
1.0.4 2020年1月21日

解析器实现 中排名 2784

Download history 42/week @ 2024-04-01 14/week @ 2024-04-08 134/week @ 2024-04-15 75/week @ 2024-04-22 62/week @ 2024-04-29 16/week @ 2024-05-06 26/week @ 2024-05-13 38/week @ 2024-05-20 40/week @ 2024-05-27 24/week @ 2024-06-03 18/week @ 2024-06-10 20/week @ 2024-06-17 23/week @ 2024-06-24 9/week @ 2024-07-08 25/week @ 2024-07-15

每月下载 59
用于 7 个crate (3个直接使用)

MIT 协议

32KB
320

reader for microXml

crev reviews Rust lines Licence Rust Documentation

版本: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 &amp; simple.
</memo>

MicroXml 只能使用 utf-8。我很幸运,因为 Rust 字符串内部是 utf-8,并且会自动检查其正确性。
MicroXml 应该通过规范化:将 CR & CRLF 转换为 LF,但我没有这样做。此外,解码 xml 控制字符 &quot;&amp;... 或解码 Unicode 编码,如 &#xE343;&#xE312;... 并不在读取器中。这留给更高版本的库来决定如何处理。
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代替CharIndices,速度可能得到提高。这可以工作,因为所有的xml分隔符都是ASCII字符。UTF-8编码的细节是ASCII字符在字符串内永远不会被误解。它们总是以0位开始。
所有其他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

无运行时依赖