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

@ -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<String>, local_name: &str, qualified_name: &str, attributes: Vec<Attribute>) {
todo!()
}

View file

@ -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<String>,

View file

@ -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<String>,

View file

@ -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" {

View file

@ -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#"<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.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<String>,
mappings: HashMap<String, String>,
}
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(