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 编程
每月 150 次下载
用于 2 个 Crates(通过 freedesktop-categories-co…)
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 节点。
请参阅相应方法的描述和示例。