From 99f900558c3862d4dcdcd9d1ad347f1e2fd05115 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maxime=20=E2=80=9Cpep=E2=80=9D=20Buquet?= Date: Wed, 10 Sep 2025 23:18:10 +0200 Subject: [PATCH] minidom: Include prefixes in serialization when using `Element::from_reader_with_prefixes` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Maxime “pep” Buquet --- minidom/CHANGELOG.md | 2 ++ minidom/src/element.rs | 16 ++++++++++++++++ minidom/src/tree_builder.rs | 10 +++++++++- 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/minidom/CHANGELOG.md b/minidom/CHANGELOG.md index d8c2ce88bd345560230e642ad5cc6dcd4e21e073..3739b92fbadf13e2e25cd5fa1b34cbcc2bad9119 100644 --- a/minidom/CHANGELOG.md +++ b/minidom/CHANGELOG.md @@ -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 diff --git a/minidom/src/element.rs b/minidom/src/element.rs index 57fcc021b7e237fb55967ca1fc81779fa36758e8..63c281d6390229e5013b29e9a67da4ba412e9e50 100644 --- a/minidom/src/element.rs +++ b/minidom/src/element.rs @@ -1077,6 +1077,22 @@ mod tests { assert_eq!(elem, elem2); } + #[test] + fn test_from_reader_with_prefixes_serialization() { + let prefixes: BTreeMap, 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#""#; + let output = r#""#; + + 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###" diff --git a/minidom/src/tree_builder.rs b/minidom/src/tree_builder.rs index 4a3e11e8570da1febaa5c6f17862f248fbeae733..2da276debfa5b1607f782467c793f2a4a4a25155 100644 --- a/minidom/src/tree_builder.rs +++ b/minidom/src/tree_builder.rs @@ -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(), )); }