minidom: Allow passing prefixes alongside a reader

Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
This commit is contained in:
Maxime “pep” Buquet 2023-01-09 13:26:30 +01:00
parent 3992c1d4f4
commit 93174f97ec
Signed by: pep
GPG key ID: DEDA74AEECA9D0F2
2 changed files with 40 additions and 0 deletions

View file

@ -346,6 +346,25 @@ impl Element {
Err(Error::EndOfDocument) Err(Error::EndOfDocument)
} }
/// Parse a document from a `BufRead`, allowing Prefixes to be specified. Useful to provide
/// knowledge of namespaces that would have been declared on parent elements not present in the
/// reader.
pub fn from_reader_with_prefixes<R: BufRead, P: Into<Prefixes>>(
reader: R,
prefixes: P,
) -> Result<Element> {
let mut tree_builder = TreeBuilder::new().with_prefixes_stack(vec![prefixes.into()]);
let mut driver = PullDriver::wrap(reader, Lexer::new(), RawParser::new());
while let Some(event) = driver.read()? {
tree_builder.process_event(event)?;
if let Some(root) = tree_builder.root.take() {
return Ok(root);
}
}
Err(Error::EndOfDocument)
}
/// Output a document to a `Writer`. /// Output a document to a `Writer`.
pub fn write_to<W: Write>(&self, writer: &mut W) -> Result<()> { pub fn write_to<W: Write>(&self, writer: &mut W) -> Result<()> {
self.to_writer(&mut ItemWriter::new(writer)) self.to_writer(&mut ItemWriter::new(writer))
@ -958,4 +977,16 @@ mod tests {
assert_eq!(elem, elem3); assert_eq!(elem, elem3);
assert_eq!(elem, elem4); assert_eq!(elem, elem4);
} }
#[test]
fn test_from_reader_with_prefixes() {
let xml = b"<foo><bar xmlns='baz'/></foo>";
let elem =
Element::from_reader_with_prefixes(&xml[..], String::from("jabber:client")).unwrap();
let xml2 = b"<foo xmlns='jabber:client'><bar xmlns='baz'/></foo>";
let elem2 = Element::from_reader(&xml2[..]).unwrap();
assert_eq!(elem, elem2);
}
} }

View file

@ -29,6 +29,15 @@ impl TreeBuilder {
} }
} }
/// Allow setting prefixes stack.
///
/// Useful to provide knowledge of namespaces that would have been declared on parent elements
/// not present in the reader.
pub fn with_prefixes_stack(mut self, prefixes_stack: Vec<Prefixes>) -> Self {
self.prefixes_stack = prefixes_stack;
self
}
/// Stack depth /// Stack depth
pub fn depth(&self) -> usize { pub fn depth(&self) -> usize {
self.stack.len() self.stack.len()