anyxml 0.1.0

A fully spec-conformant XML library
Documentation

anyxml

anyxml is a fully spec-conformant XML library.

Features

The current implementation supports the following features:

  • parse XML 1.0 document
  • validate XML 1.0 document using DTD
  • handle namespace conforming to XML Namespace 1.0

Parser

You can use a SAX-like API designed with reference to Java SAX API.

The key difference from the Java API is that SAX handlers are provided solely as two traits: SAXHandler and EntityResolver.
This approach reduces opportunities to use Rc/Arc or internal mutability.

Example

use std::fmt::Write as _;

use anyxml::sax::{
    Attribute,
    handler::{EntityResolver, SAXHandler},
    parser::XMLReaderBuilder,
};

#[derive(Default)]
struct ExampleHandler {
    buffer: String,
}
impl EntityResolver for ExampleHandler {}
impl SAXHandler for ExampleHandler {
    fn start_document(&mut self) {
        writeln!(self.buffer, "start document").ok();
    }
    fn end_document(&mut self) {
        writeln!(self.buffer, "end document").ok();
    }

    fn start_element(
        &mut self,
        _uri: Option<&str>,
        _local_name: Option<&str>,
        qname: &str,
        atts: &[Attribute]
    ) {
        writeln!(self.buffer, "start element {qname}").ok();
    }
    fn end_element(
        &mut self,
        _uri: Option<&str>,
        _local_name: Option<&str>,
        qname: &str
    ) {
        writeln!(self.buffer, "end element {qname}").ok();
    }

    fn characters(&mut self, data: &str) {
        writeln!(self.buffer, "characters '{data}'").ok();
    }
}

let mut reader = XMLReaderBuilder::new()
    .set_handler(ExampleHandler::default())
    .build();
reader.parse_str(r#"<?xml version="1.0"?><greeting>Hello!!</greeting>"#, None).ok();

let handler = reader.handler;
assert_eq!(r#"start document
start element greeting
characters 'Hello!!'
end element greeting
end document
"#, handler.buffer);

Conformance

This crate conforms to the following specifications:

Tests

This crate passes the following tests: