2个版本 (1个稳定版)
1.0.0 | 2024年5月31日 |
---|---|
0.0.0 | 2024年5月27日 |
#936 in 配置
120KB
2K SLoC
KISS-XML:保持超级简单的XML
这个Rust库提供了一个易于使用的文档对象模型(DOM),用于读取和写入XML文件。与许多其他XML解析器不同,KISS-XML简单地将给定的XML解析为一个完整的DOM,然后您可以对其进行修改并序列化回XML。无需模式或循环。
包含内容
KISS-XML提供了XML文档的基本功能,包括
- 解析XML文件和字符串到DOM
- XML元素、文本和注释
- DOM是可变的,可以保存为字符串和文件
- XML命名空间(带前缀和不带前缀的)
- CDATA
- 易于使用
不包含内容
- 模式处理
- 文档类型声明(DTD将被保留但不解释)
- 解析除UTF-8之外的字符编码
- 类型化的XML数据(例如整数属性值)
- 性能优化(优先考虑易于使用而不是快速)
如果您需要上述任何排除的XML功能,那么这个库对于您的需求来说太简单了。请尝试使用另一个XML解析crate。
快速入门指南
首先,将以下内容添加到您的Cargo.toml文件中
kiss_xml = "1"
然后要解析一个XML文件,您只需要调用kiss_xml::parse_filepath(...)
函数,如下所示
fn main() -> Result<(), kiss_xml::errors::KissXmlError> {
use kiss_xml;
let doc = kiss_xml::parse_filepath("some-file.xml")?;
println!("{}", doc.to_string());
Ok(())
}
XML内容将被转换为具有单个根元素的文档对象模型(DOM)。DOM是一种由XML元素、文本和注释节点组成的树形数据结构。您可以使用.elements_by_name(&str)
和.first_element_by_name(&str)
方法逐个探索DOM元素,使用.children()
和.child_elements()
方法扫描元素的子节点,或使用.search(...)
和.*(...)
方法进行递归搜索。
例如
fn main() -> Result<(), kiss_xml::errors::KissXmlError> {
use kiss_xml;
use kiss_xml::dom::*;
use kiss_xml::errors::*;
let xml = r#"<?xml version="1.0" encoding="UTF-8"?>
<config>
<name>My Settings</name>
<sound>
<property name="volume" value="11" />
<property name="mixer" value="standard" />
</sound>
</config>
"#;
// parse XML to a document object model (DOM)
let dom = kiss_xml::parse_str(xml)?;
// print all sound properties
let properties = dom.root_element()
.first_element_by_name("sound")?
.elements_by_name("property");
for prop in properties {
println!(
"{} = {}",
prop.get_attr("name").ok_or(DoesNotExistError::default())?,
prop.get_attr("value").ok_or(DoesNotExistError::default())?
);
}
// print children of the root element
for e in dom.root_element().child_elements() {
println!("child element <{}>", e.name())
}
// print all elements
for e in dom.root_element().search_elements(|_| true) {
println!("found element <{}>", e.name())
}
Ok(())
}
要修改DOM,请使用.*_mut(...)
方法来获取可变引用的元素,并可以使用.to_string()
方法将DOM转换为字符串或使用.write_to_filepath(...)
将其写入文件。
例如
fn main() -> Result<(), kiss_xml::errors::KissXmlError> {
use kiss_xml;
use kiss_xml::dom::*;
use kiss_xml::errors::*;
// make a DOM from scratch
let mut doc = Document::new(Element::new_from_name("politicians")?);
doc.root_element_mut().insert(0, Element::new_with_text("person", "John Adams")?);
doc.root_element_mut().append(Element::new_with_text("person", "Hillary Clinton")?);
doc.root_element_mut().append(Element::new_with_text("person", "Jimmy John")?);
doc.root_element_mut().append(Element::new_with_text("person", "Nanny No-Name")?);
// remove element by index
let _removed_element = doc.root_element_mut().remove_element(3)?;
// remove element(s) by use of a predicate function
let _num_removed = doc.root_element_mut().remove_elements(|e| e.text() == "Jimmy John");
// print first element content
println!("First politician: {}", doc.root_element().first_element_by_name("person")?.text());
// write to file
doc.write_to_filepath("tests/politics.xml");
Ok(())
}
有关更多详细信息示例,请参阅文档。
如何贡献
发现了bug?想要添加新功能?太好了!以下是您需要做的
首先,在官方KISS-XML GitHub页面上创建一个问题。确保您的问题描述中包含示例和用例。
接下来,创建一个或多个单元测试,除非正确实现bug修复/功能,否则测试将失败。单元测试可以在您的问题描述中提出,或者您可以分叉KISS-XML仓库并将它们添加到文件tests/issues.rs
中。确保所有测试函数以"test_issue_#"开头并在描述中包含对GitHub问题线程的链接。
最后,如果您已在分叉中自行实现,请从您的分叉创建一个拉取请求到staging
分支(对main
的PR将被拒绝)。
谢谢!
许可
此库是开源的,许可协议为MIT许可。您可以使用它,也可以对其进行修改,没有任何限制。
依赖关系
~2–3MB
~53K SLoC