minidom: Include prefixes in serialization when using Element::from_reader_with_prefixes

Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
This commit is contained in:
Maxime “pep” Buquet 2025-09-10 23:18:10 +02:00 committed by Jonas Schäfer
commit 99f900558c
3 changed files with 27 additions and 1 deletions

View file

@ -4,6 +4,8 @@ Version NEXT:
* Update rxml dependency to 0.13.
* Fixes
* Remove warnings for elided lifetimes (rustc 1.90)
* Fixes serialization and ensure prefixes are set on Element when using
`Element::from_reader_with_prefixes`.
Version 0.16, released 2024-07-23:
* Breaking

View file

@ -1077,6 +1077,22 @@ mod tests {
assert_eq!(elem, elem2);
}
#[test]
fn test_from_reader_with_prefixes_serialization() {
let prefixes: BTreeMap<Option<String>, String> = {
let mut tmp = BTreeMap::new();
tmp.insert(None, String::from("foo"));
tmp.insert(Some(String::from("test")), String::from("bar"));
tmp
};
let input = r#"<foo test:attr="true"><bar/></foo>"#;
let output = r#"<foo xmlns='foo' xmlns:test='bar' test:attr='true'><bar/></foo>"#;
let elem = Element::from_reader_with_prefixes(input.as_ref(), prefixes).unwrap();
assert_eq!(String::from(&elem), output);
}
#[test]
fn failure_with_duplicate_namespace() {
let _: Element = r###"<?xml version="1.0" encoding="UTF-8"?>

View file

@ -113,10 +113,18 @@ impl TreeBuilder {
RawEvent::XmlDeclaration(_, _) => {}
RawEvent::ElementHeadOpen(_, (prefix, name)) => {
// If self.prefixes_stack has been set via with_prefixes_stack before processing,
// ensure these are set on the root element.
let prefixes = if self.stack.is_empty() && self.prefixes_stack.len() == 1 {
self.prefixes_stack.pop().unwrap()
} else {
Prefixes::default()
};
self.next_tag = Some((
prefix.map(|prefix| prefix.as_str().to_owned()),
name.as_str().to_owned(),
Prefixes::default(),
prefixes,
BTreeMap::new(),
));
}