#xml #xml-parser #writer #reader #parser #reader-writer

biodivine-xml-doc

以树形结构读取、修改和写入 XML。支持 UTF-16。

1 个不稳定版本

0.3.0 2024 年 5 月 15 日

#2813解析器实现

MIT/Apache

88KB
1.5K SLoC

Biodivine/xml-doc

这是原始 xml-doc crate 的分支,现在已废弃。它修复了一些小问题,并引入了新的 API 以简化对具有命名空间的 XML 元素的操作。

xml-doc 是一个 Rust 库,用于读取、修改和写入 XML 文档。 文档

目标是能够读取 任何 XML 文件,并仅修改您想要的部分。

特性

  • 支持从大多数编码读取,包括 UTF-16。(UTF-32 是一个例外)
  • 您可以引用树的各个部分,同时仍然修改树。
  • 元素存储对其父元素的引用,因此向上遍历树速度快。
  • 这是最快的 XML 树形解析器和写入器之一。见 #性能
  • 支持属性值归一化、字符/实体引用。

由于其架构,您不能在文档之间交换节点或元素。如果您的项目同时修改多个 XML 文档,此库可能不是最佳选择。

示例

use biodivine_xml_doc::{Document, Element};

let XML = r#"<?xml version="1.0"?>
<package xmlns:dc="http://purl.org/dc/elements/1.1/">
    <metadata>
        <dc:title>xml-doc</dc:title>
        <dc:rights>MIT or Apache 2.0</dc:rights>
    </metadata>
</package>
"#;

let doc = Document::parse_str(XML).unwrap();
let package = doc.root_element().unwrap();
let metadata = package.find(&doc, "metadata").unwrap();
let title = metadata.find(&doc, "title").unwrap();
title.set_attribute("xml:lang", "en");

// Add an element to metadata: <dc:creator id="author">Yoonchae Lee</dc:creator>
let author = Element::build("dc:creator")
    .text_content("Yoonchae Lee")
    .attribute("id", "author")
    .push_to(&mut doc, metadata);

let new_xml = doc.write_str();

性能

运行基准测试: cd benches ; cargo bench

基于树的解析器

                   tiny(5KB) medium(1.5MB) large(25MB) medium(UTF-16)
xml-doc v0.2.0:     81.02us     31.08ms      355.04ms      33.33ms
minidom v0.12.0:    94.93us     43.39ms      610.41ms
roxmltree v0.14.1:  52.73us     17.23ms      353.79ms
xmltree v0.10.3:  4305.7 us   1355.0 ms    22769.  ms

只有 roxmltree 不支持写入,其速度比 xml_doc 快得多。 (基准测试结果)

基于事件的解析器

此 crate 使用 [quick-xml] 解析/写入 XML,这似乎是最快的 XML 事件解析器。 (基准测试结果)

                   tiny(5KB) medium(1.5MB) large(25MB)
quick-xml v0.17.2:  21.11us     6.63ms       97.79ms
xml-rs v0.8.4:     343.56us    96.17ms     1671.8 ms
xml5ever v0.16.2:  127.83us    42.46ms      550.83ms
RustyXML v0.3.0:   103.07us    36.40ms      710.93ms

依赖关系

~4.5MB
~139K SLoC