Merge branch 'Eijebong/minidom-rs-fix_namespaced_attributes'

lumi created

# Conflicts:
#	src/tests.rs

Change summary

src/element.rs | 21 +++++++++++++++++++--
src/tests.rs   | 12 +++++++++++-
2 files changed, 30 insertions(+), 3 deletions(-)

Detailed changes

src/element.rs 🔗

@@ -211,7 +211,15 @@ impl Element {
             match e {
                 ReaderEvent::StartElement { name, attributes, namespace } => {
                     let attributes = attributes.into_iter()
-                                               .map(|o| Attribute::new(o.name.local_name, o.value))
+                                               .map(|o| {
+                                                    Attribute::new(
+                                                        match o.name.prefix {
+                                                            Some(prefix) => format!("{}:{}", prefix, o.name.local_name),
+                                                            None => o.name.local_name
+                                                        },
+                                                        o.value
+                                                    )
+                                                })
                                                .collect();
                     let ns = if let Some(ref prefix) = name.prefix {
                         namespace.get(prefix)
@@ -219,6 +227,7 @@ impl Element {
                     else {
                         namespace.get(NS_NO_PREFIX)
                     }.map(|s| s.to_owned());
+
                     let mut root = Element::new(name.local_name, ns, attributes, Vec::new());
                     root.from_reader_inner(reader)?;
                     return Ok(root);
@@ -237,7 +246,15 @@ impl Element {
             match e {
                 ReaderEvent::StartElement { name, attributes, namespace } => {
                     let attributes = attributes.into_iter()
-                                               .map(|o| Attribute::new(o.name.local_name, o.value))
+                                               .map(|o| {
+                                                    Attribute::new(
+                                                        match o.name.prefix {
+                                                            Some(prefix) => format!("{}:{}", prefix, o.name.local_name),
+                                                            None => o.name.local_name
+                                                        },
+                                                        o.value
+                                                    )
+                                                })
                                                .collect();
                     let ns = if let Some(ref prefix) = name.prefix {
                         namespace.get(prefix)

src/tests.rs 🔗

@@ -7,11 +7,12 @@ use xml::writer::EventWriter;
 
 use element::Element;
 
-const TEST_STRING: &'static str = r#"<?xml version="1.0" encoding="utf-8"?><root xmlns="root_ns" a="b">meow<child c="d" /><child xmlns="child_ns" d="e" />nya</root>"#;
+const TEST_STRING: &'static str = r#"<?xml version="1.0" encoding="utf-8"?><root xmlns="root_ns" xml:lang="en" a="b">meow<child c="d" /><child xmlns="child_ns" d="e" xml:lang="fr" />nya</root>"#;
 
 fn build_test_tree() -> Element {
     let mut root = Element::builder("root")
                            .ns("root_ns")
+                           .attr("xml:lang", "en")
                            .attr("a", "b")
                            .build();
     root.append_text_node("meow");
@@ -22,6 +23,7 @@ fn build_test_tree() -> Element {
     let other_child = Element::builder("child")
                               .ns("child_ns")
                               .attr("d", "e")
+                              .attr("xml:lang", "fr")
                               .build();
     root.append_child(other_child);
     root.append_text_node("nya");
@@ -105,3 +107,11 @@ fn two_elements_with_same_arguments_different_order_are_equal() {
     let elem2: Element = "<a c='d' b='a'/>".parse().unwrap();
     assert_ne!(elem1, elem2);
 }
+
+#[test]
+fn namespace_attributes_works() {
+    let mut reader = EventReader::new(Cursor::new(TEST_STRING));
+    let root = Element::from_reader(&mut reader).unwrap();
+    assert_eq!("en", root.attr("xml:lang").unwrap());
+    assert_eq!("fr", root.get_child("child", "child_ns").unwrap().attr("xml:lang").unwrap());
+}