added prefixes to SaxHandler

This commit is contained in:
Shautvast 2025-07-23 12:51:46 +02:00
parent 4cd9ecceb4
commit 628f7412aa
5 changed files with 23 additions and 21 deletions

View file

@ -22,10 +22,6 @@ impl SaxHandler for PomReader{
todo!() todo!()
} }
fn end_prefix_mapping(&mut self, prefix: &str, uri: &str) {
todo!()
}
fn start_element(&mut self, uri: Option<String>, local_name: &str, qualified_name: &str, attributes: Vec<Attribute>) { fn start_element(&mut self, uri: Option<String>, local_name: &str, qualified_name: &str, attributes: Vec<Attribute>) {
todo!() todo!()
} }

View file

@ -10,12 +10,10 @@ impl SaxHandler for DebugHandler {
fn end_document(&mut self) { fn end_document(&mut self) {
debug!("end_document"); debug!("end_document");
} }
fn start_prefix_mapping(&mut self, _prefix: &str, _uri: &str) { fn start_prefix_mapping(&mut self, prefix: &str, _uri: &str) {
debug!("start_prefix_mapping"); debug!("start_prefix_mapping for {}", prefix);
}
fn end_prefix_mapping(&mut self, _prefix: &str, _uri: &str) {
debug!("end_prefix_mapping");
} }
fn start_element( fn start_element(
&mut self, &mut self,
_uri: Option<String>, _uri: Option<String>,

View file

@ -12,7 +12,6 @@ pub trait SaxHandler {
fn start_document(&mut self); fn start_document(&mut self);
fn end_document(&mut self); fn end_document(&mut self);
fn start_prefix_mapping(&mut self, prefix: &str, uri: &str); fn start_prefix_mapping(&mut self, prefix: &str, uri: &str);
fn end_prefix_mapping(&mut self, prefix: &str, uri: &str);
fn start_element( fn start_element(
&mut self, &mut self,
uri: Option<String>, uri: Option<String>,

View file

@ -110,7 +110,7 @@ impl<'a> SAXParser<'a> {
(None, qname) (None, qname)
}; };
let qualified_name = if let Some(namespace) = &namespace{ let qualified_name = if let Some(namespace) = &namespace {
&format!("{}:{}", namespace.clone(), &lname) &format!("{}:{}", namespace.clone(), &lname)
} else { } else {
&lname &lname
@ -123,7 +123,8 @@ impl<'a> SAXParser<'a> {
if self.current == '/' { if self.current == '/' {
self.advance()?; self.advance()?;
let namespace = self.pop_namespace(); 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.expect_char('>')?;
self.skip_whitespace()?; self.skip_whitespace()?;
@ -139,7 +140,10 @@ impl<'a> SAXParser<'a> {
if att_name.starts_with("xmlns:") { if att_name.starts_with("xmlns:") {
let prefix = att_name[6..].to_string(); 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" { let namespace = if att_name == "xmlns" {

View file

@ -1,3 +1,4 @@
use std::collections::HashMap;
use undeepend::xml::sax_parser::parse_string; use undeepend::xml::sax_parser::parse_string;
use undeepend::xml::{Attribute, SaxError, SaxHandler}; use undeepend::xml::{Attribute, SaxError, SaxHandler};
@ -120,10 +121,16 @@ fn test_namespace_prefixes() {
testhandler.elements[2], testhandler.elements[2],
r#"<http://example.com/books:page>"# r#"<http://example.com/books:page>"#
); );
assert_eq!(testhandler.elements[3], r#"<http://example.com/covers:cover>"#); assert_eq!(
testhandler.elements[3],
r#"<http://example.com/covers:cover>"#
);
assert_eq!(testhandler.elements[4], r#"<publisher>"#); assert_eq!(testhandler.elements[4], r#"<publisher>"#);
assert_eq!(testhandler.end_element_called, 5); assert_eq!(testhandler.end_element_called, 5);
assert_eq!(testhandler.end_document_called, 1); 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)] #[derive(Debug)]
@ -133,6 +140,7 @@ struct TestHandler {
start_element_called: usize, start_element_called: usize,
end_element_called: usize, end_element_called: usize,
elements: Vec<String>, elements: Vec<String>,
mappings: HashMap<String, String>,
} }
impl TestHandler { impl TestHandler {
@ -143,6 +151,7 @@ impl TestHandler {
start_element_called: 0, start_element_called: 0,
end_element_called: 0, end_element_called: 0,
elements: vec![], elements: vec![],
mappings: HashMap::new(),
} }
} }
} }
@ -156,12 +165,8 @@ impl SaxHandler for TestHandler {
self.end_document_called += 1; self.end_document_called += 1;
} }
fn start_prefix_mapping(&mut self, _prefix: &str, _uri: &str) { fn start_prefix_mapping(&mut self, prefix: &str, uri: &str) {
todo!() self.mappings.insert(prefix.to_string(), uri.to_string());
}
fn end_prefix_mapping(&mut self, _prefix: &str, _uri: &str) {
todo!()
} }
fn start_element( fn start_element(