Skip to content

Commit 99f9005

Browse files
Ppjet6horazont
authored andcommitted
minidom: Include prefixes in serialization when using Element::from_reader_with_prefixes
Signed-off-by: Maxime “pep” Buquet <[email protected]>
1 parent 0cf06f0 commit 99f9005

File tree

3 files changed

+27
-1
lines changed

3 files changed

+27
-1
lines changed

minidom/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ Version NEXT:
44
* Update rxml dependency to 0.13.
55
* Fixes
66
* Remove warnings for elided lifetimes (rustc 1.90)
7+
* Fixes serialization and ensure prefixes are set on Element when using
8+
`Element::from_reader_with_prefixes`.
79

810
Version 0.16, released 2024-07-23:
911
* Breaking

minidom/src/element.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1077,6 +1077,22 @@ mod tests {
10771077
assert_eq!(elem, elem2);
10781078
}
10791079

1080+
#[test]
1081+
fn test_from_reader_with_prefixes_serialization() {
1082+
let prefixes: BTreeMap<Option<String>, String> = {
1083+
let mut tmp = BTreeMap::new();
1084+
tmp.insert(None, String::from("foo"));
1085+
tmp.insert(Some(String::from("test")), String::from("bar"));
1086+
tmp
1087+
};
1088+
1089+
let input = r#"<foo test:attr="true"><bar/></foo>"#;
1090+
let output = r#"<foo xmlns='foo' xmlns:test='bar' test:attr='true'><bar/></foo>"#;
1091+
1092+
let elem = Element::from_reader_with_prefixes(input.as_ref(), prefixes).unwrap();
1093+
assert_eq!(String::from(&elem), output);
1094+
}
1095+
10801096
#[test]
10811097
fn failure_with_duplicate_namespace() {
10821098
let _: Element = r###"<?xml version="1.0" encoding="UTF-8"?>

minidom/src/tree_builder.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,10 +113,18 @@ impl TreeBuilder {
113113
RawEvent::XmlDeclaration(_, _) => {}
114114

115115
RawEvent::ElementHeadOpen(_, (prefix, name)) => {
116+
// If self.prefixes_stack has been set via with_prefixes_stack before processing,
117+
// ensure these are set on the root element.
118+
let prefixes = if self.stack.is_empty() && self.prefixes_stack.len() == 1 {
119+
self.prefixes_stack.pop().unwrap()
120+
} else {
121+
Prefixes::default()
122+
};
123+
116124
self.next_tag = Some((
117125
prefix.map(|prefix| prefix.as_str().to_owned()),
118126
name.as_str().to_owned(),
119-
Prefixes::default(),
127+
prefixes,
120128
BTreeMap::new(),
121129
));
122130
}

0 commit comments

Comments
 (0)