2个版本 (1个稳定版)

1.0.0 2024年5月31日
0.0.0 2024年5月27日

#936 in 配置

MIT 许可证

120KB
2K SLoC

KISS-XML:保持超级简单的XML

GitHub Workflow Build Status GitHub Workflow Test Status codecov Crate.io Redistribution license

这个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