#xpath #xml #dom #sax #xml-document #x-path3

bin+lib amxml

具有 XPath 2.0 / 3.0 / 3.1 部分功能的 XML 处理器

7 个版本

使用旧的 Rust 2015

0.5.3 2018 年 9 月 18 日
0.5.2 2018 年 8 月 7 日
0.5.1 2018 年 7 月 26 日
0.4.9 2018 年 7 月 3 日
0.4.8 2018 年 6 月 25 日

#1194 in Web 编程

Download history 41/week @ 2024-03-11 87/week @ 2024-03-18 16/week @ 2024-03-25 42/week @ 2024-04-01 24/week @ 2024-04-08 28/week @ 2024-04-15 29/week @ 2024-04-22 7/week @ 2024-04-29 18/week @ 2024-05-06 42/week @ 2024-05-13 21/week @ 2024-05-20 22/week @ 2024-05-27 23/week @ 2024-06-03 11/week @ 2024-06-10 49/week @ 2024-06-17 66/week @ 2024-06-24

每月 150 次下载
用于 2 个 Crates(通过 freedesktop-categories-co…

MIT/Apache

565KB
11K SLoC

amxml

具有 XPath 2.0 / 3.0 / 3.1 部分功能的 Rust XML 处理器。

从 XML 文档字符串构建 DOM 树

可以通过调用 new_document() 函数来构建 DOM 树。DOM 树可以被转换为 String。

use amxml::dom::*;
let xml_string = r#"<?xml version="1.0"?><article>foo</article>"#;
let doc = new_document(&xml_string).unwrap();
let result = doc.to_string();
assert_eq!(result, xml_string);

导航 DOM 树

可以通过 root_element()parent()first_child()nth_child()attribute_value() 方法来导航 DOM 树或检索 DOM 节点。

请参阅相应方法的描述和示例。

通过 XPath 检索 DOM 节点

但是,检索 DOM 节点更方便的方式可能是使用 XPath,尤其是在搜索条件不简单的情况下。

第一个 XPath 示例相对简单。 each_node() 方法遍历与给定 XPath 匹配的 DOM 节点,并将函数(闭包)应用于这些节点。

use amxml::dom::*;
let xml = r#"<root><a img="a1"/><a img="a2"/></root>"#;
let doc = new_document(xml).unwrap();
let mut img = String::new();
doc.each_node("/root/a", |n| {
    img += n.attribute_value("img").unwrap().as_str();
});
assert_eq!(img, "a1a2");

第二个 XPath 示例更复杂。这找到了没有下属的职员或工程师(不是顾问)。请注意,职员和工程师在 each_node() 迭代中按 文档顺序 出现。

use amxml::dom::*;
let xml = r#"
<root>
    <clerk name="Ann">
        <advisor name="Betty"/>
        <clerk name="Charlie"/>
    </clerk>
    <engineer name="Dick">
        <engineer name="Emily"/>
    </engineer>
    <clerk name="Fred"/>
</root>
"#;
let doc = new_document(xml).unwrap();
let root = doc.root_element();
let xpath = "(//clerk | //engineer)[count(./*) = 0]";
let mut names = String::new();
root.each_node(xpath, |n| {
    names += n.attribute_value("name").unwrap().as_str();
    names += "; ";
});
assert_eq!(names, "Charlie; Emily; Fred; ");

还可以查看 each_node()get_first_node()get_nodeset() 方法的描述和示例。

评估 XPath

XPath 还可以用于评估 DOM 树并获取布尔值、数值、字符串值以及 DOM 节点。下面的示例列出了学生,以及每个学生是否在每个(不是 一些)考试中得到了 80 分或更高。

use amxml::dom::*;
let xml = r#"
<root>
    <student>
        <name>George</name>
        <exam subject="math" point="70"/>
        <exam subject="science" point="90"/>
    </student>
    <student>
        <name>Harry</name>
        <exam subject="math" point="80"/>
        <exam subject="science" point="95"/>
    </student>
    <student>
        <name>Ivonne</name>
        <exam subject="math" point="60"/>
        <exam subject="science" point="75"/>
    </student>
</root>
"#;
let doc = new_document(xml).unwrap();
let root = doc.root_element();
let xpath= r#"
for $student in /root/student return
    ($student/name/text(),
     every $exam in $student/exam satisfies number($exam/@point) >= 80)
"#;
let result = root.eval_xpath(xpath).unwrap();
assert_eq!(result.to_string(), "(George, false, Harry, true, Ivonne, false)");

修改 DOM 节点

可以通过 append_child()insert_as_previous_sibling()insert_as_next_sibling()delete_child()replace_with()set_attribute()delete_attribute() 方法等来插入、替换或删除 DOM 节点。

请参阅相应方法的描述和示例。

无运行时依赖