diff --git a/src/maven/pom_reader.rs b/src/maven/pom_reader.rs index 7e70033..35211a6 100644 --- a/src/maven/pom_reader.rs +++ b/src/maven/pom_reader.rs @@ -21,11 +21,7 @@ impl SaxHandler for PomReader{ fn start_prefix_mapping(&mut self, prefix: &str, uri: &str) { todo!() } - - fn end_prefix_mapping(&mut self, prefix: &str, uri: &str) { - todo!() - } - + fn start_element(&mut self, uri: Option, local_name: &str, qualified_name: &str, attributes: Vec) { todo!() } diff --git a/src/xml/debug.rs b/src/xml/debug.rs index 89030b0..e0591e7 100644 --- a/src/xml/debug.rs +++ b/src/xml/debug.rs @@ -10,12 +10,10 @@ impl SaxHandler for DebugHandler { fn end_document(&mut self) { debug!("end_document"); } - fn start_prefix_mapping(&mut self, _prefix: &str, _uri: &str) { - debug!("start_prefix_mapping"); - } - fn end_prefix_mapping(&mut self, _prefix: &str, _uri: &str) { - debug!("end_prefix_mapping"); + fn start_prefix_mapping(&mut self, prefix: &str, _uri: &str) { + debug!("start_prefix_mapping for {}", prefix); } + fn start_element( &mut self, _uri: Option, diff --git a/src/xml/mod.rs b/src/xml/mod.rs index 8c9af14..fef7bb1 100644 --- a/src/xml/mod.rs +++ b/src/xml/mod.rs @@ -12,7 +12,6 @@ pub trait SaxHandler { fn start_document(&mut self); fn end_document(&mut self); fn start_prefix_mapping(&mut self, prefix: &str, uri: &str); - fn end_prefix_mapping(&mut self, prefix: &str, uri: &str); fn start_element( &mut self, uri: Option, diff --git a/src/xml/sax_parser.rs b/src/xml/sax_parser.rs index 2f0c3ea..492f8ae 100644 --- a/src/xml/sax_parser.rs +++ b/src/xml/sax_parser.rs @@ -110,7 +110,7 @@ impl<'a> SAXParser<'a> { (None, qname) }; - let qualified_name = if let Some(namespace) = &namespace{ + let qualified_name = if let Some(namespace) = &namespace { &format!("{}:{}", namespace.clone(), &lname) } else { &lname @@ -123,7 +123,8 @@ impl<'a> SAXParser<'a> { if self.current == '/' { self.advance()?; let namespace = self.pop_namespace(); - self.handler.end_element(namespace, lname.as_str(), qualified_name); + self.handler + .end_element(namespace, lname.as_str(), qualified_name); } self.expect_char('>')?; self.skip_whitespace()?; @@ -139,7 +140,10 @@ impl<'a> SAXParser<'a> { if att_name.starts_with("xmlns:") { let prefix = att_name[6..].to_string(); - self.prefix_mapping.insert(prefix, att_value.to_string()); + self.prefix_mapping + .insert(prefix.clone(), att_value.to_string()); + self.handler + .start_prefix_mapping(&prefix, &att_value); } let namespace = if att_name == "xmlns" { diff --git a/tests/xml/sax_parser_test.rs b/tests/xml/sax_parser_test.rs index d77bc63..b229229 100644 --- a/tests/xml/sax_parser_test.rs +++ b/tests/xml/sax_parser_test.rs @@ -1,3 +1,4 @@ +use std::collections::HashMap; use undeepend::xml::sax_parser::parse_string; use undeepend::xml::{Attribute, SaxError, SaxHandler}; @@ -120,10 +121,16 @@ fn test_namespace_prefixes() { testhandler.elements[2], r#""# ); - assert_eq!(testhandler.elements[3], r#""#); + assert_eq!( + testhandler.elements[3], + r#""# + ); assert_eq!(testhandler.elements[4], r#""#); assert_eq!(testhandler.end_element_called, 5); assert_eq!(testhandler.end_document_called, 1); + assert_eq!(testhandler.mappings.len(), 2); + assert_eq!(testhandler.mappings["books"], "http://example.com/books"); + assert_eq!(testhandler.mappings["covers"], "http://example.com/covers"); } #[derive(Debug)] @@ -133,6 +140,7 @@ struct TestHandler { start_element_called: usize, end_element_called: usize, elements: Vec, + mappings: HashMap, } impl TestHandler { @@ -143,6 +151,7 @@ impl TestHandler { start_element_called: 0, end_element_called: 0, elements: vec![], + mappings: HashMap::new(), } } } @@ -156,12 +165,8 @@ impl SaxHandler for TestHandler { self.end_document_called += 1; } - fn start_prefix_mapping(&mut self, _prefix: &str, _uri: &str) { - todo!() - } - - fn end_prefix_mapping(&mut self, _prefix: &str, _uri: &str) { - todo!() + fn start_prefix_mapping(&mut self, prefix: &str, uri: &str) { + self.mappings.insert(prefix.to_string(), uri.to_string()); } fn start_element(