Expand description
§rusty_xml
rusty_xml is a ground-up, pure-Rust remake of libxml2: well-formed XML 1.0 parse, arena DOM, SAX2, pull reader, writer/save, XPath 1.0, DTD, C14N, HTML, and working subsets of RelaxNG / XSD / Schematron.
#![forbid(unsafe_code)]on every published crate, no C, nolibxml2-sys, no copyleft. Defaults areXML_PARSE_NONET | XML_PARSE_NO_XXE— the safe posture libxml2’s own README says the C library does not have.
Part of Remade With Rust by Mata Network — the XML toolkit for the stack that already ships rusty_zstd, rusty_h264, and remade_ffmpeg_rs. Jump to the ecosystem ↓
§The headline
A pure-safe-Rust XML 1.0 toolkit that is a reimplementation, not a
wrapper, with libxml2 function names as #[doc(alias)] and safe defaults
C historically got wrong:
- Parse: UTF-8 well-formed documents, 15 built-in 8-bit encodings (no
iconv), push (
xmlParseChunk), IO callbacks, local OASIS catalogs. SAX traces are gated line-for-line against pinnedxmllint --sax. - Tree / save / writer / reader: arena DOM,
xmlsave(includingXML_SAVE_NO_EMPTY/NO_DECL),xmlTextWriter,xmlTextReader. Empty elements are one readerElement, no extraEndElement.parse(write(parse(x)))is a standing gate. - XPath 1.0 compile + eval;
rxmlint --xpathprints xmllint form. - Validate / canonicalize: DTD internal subset + default attributes,
xmlValidateDocument, C14N 1.0 and exclusive, XInclude via a caller loader. - HTML (
HTMLparser.cgrammar, implied html/head/body) and working subsets of RelaxNG, XML Schema, and Schematron. - CLI is
rxmlint, neverxmllint. Same flag language so a bench script can swap argv[0]. - The C oracle is an external process. We never link libxml2. Pin:
libxml2 v2.15.3 (
oracle/PIN).
| libxml2 (C) | rusty_xml (Rust) | |
|---|---|---|
| C/C++ in the dependency tree | all of it | none — no libxml2-sys, no iconv, no zlib-sys |
unsafe in the published crates | extensive | 0 — #![forbid(unsafe_code)] |
| License | MIT | MIT OR Apache-2.0 |
| Defaults on untrusted input | libxml2 README: not recommended | NONET | NO_XXE, always |
| CLI name | xmllint | rxmlint (does not shadow C) |
| Network entity loads | historically on | off unless you pass flags (and the parser still ORs NONET) |
§Performance — faster than libxml2
Paired board against pinned libxml2 v2.15.3 xmllint. Pinned to one core
(not core 0), High priority, CPU time, arms ABBA-interleaved, N=20
pairs, C-vs-C null arm per row. us/C < 1 means rusty_xml is faster. Raw
rows and the full method line: bench/SIDE-BY-SIDE.md.
| workload (parse to DOM, discard) | rusty_xml | libxml2 | us/C | wins |
|---|---|---|---|---|
big-attr.xml — 627 KB, 48k attributes | 83.3 MB/s | 37.2 MB/s | 0.45× | 20/20, z = +4.47 |
big-300k.xml — 308 KB, text-heavy | 125.6 MB/s | 78.5 MB/s | 0.63× | 20/20, z = +4.47 |
big-1m.xml — 1.27 MB, real content | 115.7 MB/s | 74.6 MB/s | 0.64× | 20/20, z = +4.47 |
1.6× to 2.2× faster than the C library, on every file, in every pair.
Two numbers, because one alone would mislead. The table is
as shipped: rxmlint links rusty_alloc
(pure-Rust mimalloc) and xmllint uses the system allocator — that is what you
actually run. Same allocator, both on the system allocator, the parser
alone: big-attr 0.80×, big-300k 1.07×. Roughly half the margin is
the allocator, and C could adopt one too. Also: C runs xmlCtxtReadFile per
--repeat (the Windows pin has no mmap) while we do one fs::read then
xml_read_memory — about 1% at these sizes, but it inflates C on small files,
so the large rows are the honest result. Flags differ (C defaults to
XML_PARSE_COMPACT \| XML_PARSE_BIG_LINES; we force NONET \| NO_XXE). This
is CLI-vs-CLI, not a kernel A/B. Correctness is gated byte-identical against
the same pinned oracle throughout.
§Conformance — where we actually stand
Speed is the easy half. Here is the hard half, measured against the W3C XML Conformance Test Suite rather than against our own corpus, with the pinned C build scored on the identical cases:
| rusty_xml 0.8.0 | libxml2 2.15.3 | |
|---|---|---|
| Total (2036 scored cases) | 99.9% | 95.9% |
| valid documents accepted (601) | 100.0% | 100.0% |
| invalid documents rejected (175) | 100.0% | 53.7% |
well-formedness (not-wf, 1260) | 99.8% | 99.8% |
2034 of 2036. Every valid document accepted, every invalid one rejected, and one more not-well-formed case caught than libxml2.
The namespace cases are scored the way libxml2’s own runxmlconf.c scores them
– a namespace violation is not a well-formedness error, so the document must
PARSE and the error must be REPORTED. Reading them any other way marks both
implementations wrong. doc.namespace_errors carries the reports, because the
default SAX handler discards errors and a tree-parsing caller would never see
them.
The two cases left are not closable honestly: one is a duplicate attribute with the same QName, which is a well-formedness error we reject and libxml2 rejects (the namespace scorer counts that as a failure for both), and the other wants a contradiction between a declared encoding and the byte-order mark to be fatal, where C exits zero. libxml2 fails three; we fail two.
A correction. 0.4.0 published “79.9%, level with libxml2” and that number
was measured wrong. The suite marks 313 cases EDITION="1 2 3 4" – they test
the name rules of XML 1.0 before the 5th edition, which is not the language
either implementation parses by default. libxml2’s own runxmlconf.c reads
that attribute and parses those cases with XML_PARSE_OLD10; our runner
ignored it and scored a 5th-edition parser against 4th-edition expectations,
counting 313 non-failures as failures for both sides. Correcting the runner
moved the real figures to 90.0% and 94.8% – we were behind, not level – and
exposed that XML_PARSE_OLD10 never reached the DTD parser at all.
0.2.0 never ran the suite. The first run, in 0.3.0, crashed before scoring a single case – a 32 GB allocation reachable from thirty-two bytes of DTD – and then scored 59.1%. Everything since came from reading failures rather than guessing: an internal subset parser that was a scanner rather than a parser, four literals never character-validated, a validator whose ID branch said “uniqueness checked loosely” and meant not at all, and an entity whose replacement text was inserted as escaped text instead of the markup it was.
Run it yourself — the suite is fetched, never vendored:
pwsh scripts/fetch-xmlconf.ps1
cargo run --release -p rusty_xml-bench --bin xmlconf -- --oracleWhat we do gate hard, and what those numbers cost nothing:
- 62 of 64 byte-identical comparisons against pinned
xmllintover 16 corpora x {plain,--format,--c14n,--exc-c14n}. The two exceptions are one deliberate divergence: we serialize the internal DTD subset verbatim where C re-serializes and reorders it. - 0
unsafein all twelve crates. - Nothing on the parse, save, format, XPath, stream or canonicalize path recurses per level of nesting, so document depth cannot exhaust the stack.
- A seeded fuzzer (
--bin fuzz) holds four invariants: no panics, chunked parsing equals whole parsing at every chunk size, and both XML and HTML round trips are fixed points.
If you need full libxml2 conformance today, use libxml2. If you need a memory-safe XML toolkit that is faster than C, has no C in its dependency tree, and tells you exactly which cases it gets wrong, this is it.
§What is this?
rusty_xml is libxml2 remade in Rust. Unlike
libxml2-sys / quick-xml /
roxmltree — bindings or different grammars — there is no C in the
dependency tree here and the public names match C (xmlReadMemory →
xml_read_memory, documented with #[doc(alias)]).
libxml2’s own README says it is not recommended for untrusted data. That is the defect this remake exists to close: semantic identity under matched options, safe defaults (no network, no XXE, bounded amplification).
It is a reimplementation of the algorithms, not a fork. The C sources are
neither distributed nor linked; a pinned xmllint is used only as an
external-process oracle (scripts/fetch-oracle.ps1).
cargo-deny enforces the promise: no *-sys crate, no copyleft, and no
libxml2-sys anywhere in the graph.
§The Remade With Rust ecosystem
Remade With Rust is an initiative by Mata Network to rebuild essential C and C++ tools in Rust — for the memory safety, the predictable performance, and the freedom of a permissive license. Each project is a reimplementation, not a fork: same wire protocols and file formats, new code you can actually depend on.
We build the core to production grade and open-source it so the community can extend it. No copyleft. No surprises. Just the tools we rely on, made faster and safer.
| Project | What it is |
|---|---|
| 🎬 remade_ffmpeg_rs | Our FFmpeg alternative. Drop-in ffmpeg and ffprobe binaries — demux → decode → filter → encode → mux, rebuilt as composable Rust crates with zero GPL/LGPL. Apache-2.0. |
| 🧠 FFAI | Our sister project: media for AI. “The AI media toolkit, remade with rust.” Embedded ASR + TTS (Mercury), OCR (Carmenta) and vision-language captioning (Argus) behind an ffmpeg-style, swap-by-name architecture — no Python, no CUDA. MIT OR Apache-2.0. |
| 🌐 Mata Network | The home page. “Stop sacrificing your privacy for convenience.” Sovereign, self-hostable privacy infrastructure — wallet & identity, password manager, contact manager, and a browser extension that stops information leaking as you browse. Remade With Rust is its open-source arm. |
→ All projects: github.com/Remade-With-Rust
§Install
One crate — rusty_xml — is the public facade; it re-exports parser, tree,
SAX, reader, writer, XPath, and validation. Add it with:
cargo add rusty_xmlor in Cargo.toml:
[dependencies]
rusty_xml = "0.8"MSRV is 1.85. The library never sets #[global_allocator].
The published crates (all 0.1, MIT OR Apache-2.0):
| Crate | Role | Docs |
|---|---|---|
rusty_xml | the facade — depend on this | docs.rs |
rusty_xml-parser | well-formed parse, encodings, push, catalogs, HTML | docs.rs |
rusty_xml-tree | arena DOM | docs.rs |
rusty_xml-sax | SAX2 recorder + xmllint-debug dump | docs.rs |
rusty_xml-reader | xmlTextReader | docs.rs |
rusty_xml-writer | xmlsave + xmlTextWriter | docs.rs |
rusty_xml-xpath | XPath 1.0 | docs.rs |
rusty_xml-valid | DTD, C14N, RelaxNG, XSD, Schematron | docs.rs |
rusty_xml-cli | rxmlint binary | — |
rusty_xml-alloc | allocator seam for binaries only — the library never uses it | — |
Not published: rusty_xml-bench (oracle harness), rusty_xml-c-abi (M8 stub).
The library picks no allocator. rusty_xml-alloc pins
rusty_alloc for rxmlint; the
published library declares no #[global_allocator] and does not depend on it,
so an embedding application keeps that choice — and gets the same win for free
if it already ships rusty_alloc.
Dropping it into a downstream tool: depend on the facade. Call
xml_read_memory / xml_reader_for_memory / xml_xpath_eval. Do not add
libxml2-sys. Safe defaults are already on; you do not opt into NONET.
§Quick start
use rusty_xml::{default_parse_options, xml_read_memory, xml_save_doc};
fn main() -> Result<(), rusty_xml::XmlError> {
let xml = br#"<root><item id="1">hi</item></root>"#;
let doc = xml_read_memory(xml, None, None, default_parse_options())?;
let bytes = xml_save_doc(&doc, 0);
assert!(std::str::from_utf8(&bytes).unwrap().contains("<item"));
Ok(())
}XPath 1.0 on the same tree:
use rusty_xml::{
default_parse_options, xml_read_memory, xml_xpath_eval, XmlXPathContext, XPathObject,
};
fn main() -> Result<(), rusty_xml::XmlError> {
let doc = xml_read_memory(
br#"<root><item>a</item><item>b</item></root>"#,
None,
None,
default_parse_options(),
)?;
let ctx = XmlXPathContext::xml_xpath_new_context(&doc);
match xml_xpath_eval("count(//item)", &ctx).unwrap() {
XPathObject::Number(n) => assert_eq!(n, 2.0),
other => panic!("expected number, got {other:?}"),
}
Ok(())
}Pull reader:
use rusty_xml::{default_parse_options, xml_reader_for_memory};
fn main() -> Result<(), rusty_xml::XmlError> {
let mut r = xml_reader_for_memory(
br#"<a><b/></a>"#,
None,
None,
default_parse_options(),
)?;
let mut ticks = 0u32;
while r.read() == 1 {
ticks += 1;
}
assert!(ticks >= 2);
Ok(())
}Command-line (never installs as xmllint):
cargo install rusty_xml-cli
rxmlint --noout file.xml
rxmlint --sax --noout file.xml
rxmlint --stream --noout file.xml
rxmlint --xpath "//item" file.xml
rxmlint --c14n file.xml§Architecture
The workspace mirrors libxml2’s headers, not its build:
crates/
rusty_xml public facade ← depend on this
rusty_xml-parser parser.h — well-formed, encodings, push, catalogs, HTML
rusty_xml-tree tree.h — arena DOM
rusty_xml-sax SAX2.h — recorder + xmllint-debug dump
rusty_xml-reader xmlreader.h
rusty_xml-writer xmlsave.h + xmlwriter.h
rusty_xml-xpath xpath.h
rusty_xml-valid valid.h, c14n, RelaxNG / XSD / Schematron subsets
rusty_xml-cli rxmlint (not xmllint)
rusty_xml-c-abi optional cdylib, stub until M8. Not published.
rusty_xml-bench shells out to pinned xmllint. Never links libxml2.
rusty_xml-alloc rusty_alloc seam for binaries only. Library never uses it.
bench/ pinned oracle-vs-us timing harness (pinvs.ps1)
oracle/PIN libxml2 v2.15.3 pin (binary is gitignored)§Platform support
| Platform | Status |
|---|---|
| Windows (x86-64) | ✅ builds + tests |
| Linux | ✅ builds + tests |
| macOS | ✅ builds + tests |
wasm32-unknown-unknown | ✅ library cargo check in CI |
No C toolchain, no iconv, no nasm. Gzip (XML_PARSE_UNZIP) is not wired yet
(a 1f 8b buffer is an error). ISO-2022-JP / Shift_JIS / EUC-JP are
unsupported, matching libxml2 built without iconv.
§Roadmap
- M0 — pin oracle (libxml2 v2.15.3), C-only board, workspace skeleton
-
M1 — character classes, UTF-8 well-formed parse, SAX-exact vs
xmllint --sax -
M2 — tree mutation,
xmlsave,xmlTextWriter,xmlTextReader, round-trip - M3 — encodings without iconv, push parser, IO callbacks, local catalogs
-
M4 — XPath 1.0 compile + eval,
rxmlint --xpath - M5 — DTD validation, C14N 1.0 + exclusive, XInclude (loader-gated)
- M6 — HTML parser, RelaxNG / XSD / Schematron working subsets
-
M7 — performance campaign vs pinned
xmllint: faster than C on every corpus file, N=20, 20/20 pairs (bench/SIDE-BY-SIDE.md) -
Optional gzip (
miniz_oxide/XML_PARSE_UNZIP) - M8 — W3C conformance suite wired up and scored against the C oracle (65.0% vs libxml2 79.9%); seeded fuzzer; corpus widened 7 -> 16 files
- M9 — close the conformance gap: 65.0% -> 99.9% on the W3C suite, ahead of libxml2’s 95.9%; 601/601 valid, 175/175 invalid, 1258/1260 not-wf
-
C ABI
cdylib(XMLPUBFUNnames) + hardening audit -
Optional gzip (
miniz_oxide/XML_PARSE_UNZIP) - XML 1.1, external entity loading, CJK multi-byte encodings
Plan: docs/plan/rusty_xml.md.
§License
MIT OR Apache-2.0, at your option — see LICENSE-MIT and
LICENSE-APACHE. No GPL/LGPL and no C anywhere in the
dependency tree, CI-enforced with cargo-deny. The C xmllint binary used
as a measurement oracle is neither distributed here nor linked; see
NOTICE.md.
§About Mata Network
Mata Network builds sovereign, self-hostable privacy infrastructure — “stop sacrificing your privacy for convenience”: wallet & identity, a password manager, a contact manager, and a browser extension that stops your information leaking as you browse.
Remade With Rust is our open-source home for the permissively-licensed building blocks that work depends on — including remade_ffmpeg_rs (the FFmpeg alternative) and FFAI (the AI media toolkit).
Modules§
- chvalid
- Character classes transcribed from libxml2 v2.15.3
chvalid.h/chvalid.c.xml_is_charuses thexmlIsCharQformula, not the range tables.
Structs§
- Attr
Decl - Node
- NodeId
- Stable handle into an
XmlDocarena. Valid for the lifetime of the doc. - NullSax
- A handler that discards every callback, using the trait’s default bodies.
- SaxAttr
- Attribute as delivered to
startElementNs. - SaxRecorder
- Records every callback for the event-exact gate.
- XmlCatalog
- XmlDoc
- libxml2
xmlDoc. - XmlDtd
- Parsed DTD attached to a document (
xmlDtd). - XmlError
- Parser / tree error with C discriminant.
- XmlParser
Ctxt - Parser context (
xmlParserCtxt). - XmlPush
Parser Ctxt - Push parser context (
xmlCreatePushParserCtxt). - XmlText
Reader xmlTextReader.- XmlText
Writer xmlTextWriterwriting into an in-memory buffer.- XmlX
Path Context
Enums§
- Attr
Default - Element
Decl - Node
Kind - libxml2
xmlElementTypediscriminants. - Reader
Type - libxml2
xmlReaderTypes. - SaxEvent
- One SAX2 callback as recorded for the event-exact gate.
- XPath
Object - XmlChar
Encoding - libxml2
xmlCharEncodingdiscriminants.
Constants§
- HTML_
PARSE_ NOIMPLIED - libxml2
htmlParserOptionbits we honour. - HTML_
PARSE_ NONET - XML_
C14N_ 1_ 0 - libxml2
xmlC14NMode. - XML_
C14N_ 1_ 1 - XML_
C14N_ EXCLUSIVE_ 1_ 0 - XML_
ERR_ ATTRIBUTE_ NOT_ STARTED - XML_
ERR_ ATTRIBUTE_ REDEFINED - XML_
ERR_ ATTRIBUTE_ WITHOUT_ VALUE - XML_
ERR_ CDATA_ NOT_ FINISHED - XML_
ERR_ COMMENT_ NOT_ FINISHED - XML_
ERR_ DOCUMENT_ EMPTY - XML_
ERR_ DOCUMENT_ END - XML_
ERR_ DOCUMENT_ START - XML_
ERR_ ENCODING_ NAME - XML_
ERR_ ENTITYREF_ NO_ NAME - XML_
ERR_ ENTITYREF_ SEMICOL_ MISSING - XML_
ERR_ EQUAL_ REQUIRED - XML_
ERR_ EXTRA_ CONTENT - XML_
ERR_ GT_ REQUIRED - XML_
ERR_ HYPHEN_ IN_ COMMENT - XML_
ERR_ INTERNAL_ ERROR - XML_
ERR_ INVALID_ CHAR - XML_
ERR_ INVALID_ CHARREF - XML_
ERR_ INVALID_ DEC_ CHARREF - XML_
ERR_ INVALID_ HEX_ CHARREF - XML_
ERR_ LITERAL_ NOT_ FINISHED - XML_
ERR_ LT_ IN_ ATTRIBUTE - XML_
ERR_ LT_ REQUIRED - XML_
ERR_ MISPLACED_ CDATA_ END - XML_
ERR_ NAME_ REQUIRED - XML_
ERR_ NO_ MEMORY - XML_
ERR_ OK - XML_
ERR_ PI_ NOT_ FINISHED - XML_
ERR_ RESERVED_ XML_ NAME - XML_
ERR_ SPACE_ REQUIRED - XML_
ERR_ TAG_ NAME_ MISMATCH - XML_
ERR_ TAG_ NOT_ FINISHED - XML_
ERR_ UNDECLARED_ ENTITY - XML_
ERR_ UNSUPPORTED_ ENCODING - XML_
ERR_ XMLDECL_ NOT_ FINISHED - XML_
NS_ ERR_ ATTRIBUTE_ REDEFINED - XML_
NS_ ERR_ QNAME - XML_
NS_ ERR_ UNDEFINED_ NAMESPACE - XML_
NS_ ERR_ XML_ NAMESPACE - XML_
PARSE_ BIG_ LINES - XML_
PARSE_ CATALOG_ PI - XML_
PARSE_ COMPACT - XML_
PARSE_ DTDATTR - XML_
PARSE_ DTDLOAD - XML_
PARSE_ DTDVALID - XML_
PARSE_ HUGE - XML_
PARSE_ IGNORE_ ENC - XML_
PARSE_ NOBASEFIX - XML_
PARSE_ NOBLANKS - XML_
PARSE_ NOCDATA - XML_
PARSE_ NODICT - XML_
PARSE_ NOENT - XML_
PARSE_ NOERROR - XML_
PARSE_ NONET - XML_
PARSE_ NOWARNING - XML_
PARSE_ NOXINCNODE - XML_
PARSE_ NO_ SYS_ CATALOG - XML_
PARSE_ NO_ TREE - Deliver SAX events without building a document tree. A rusty_xml extension, not a libxml2 flag.
- XML_
PARSE_ NO_ XXE - XML_
PARSE_ NSCLEAN - XML_
PARSE_ OLD10 - XML_
PARSE_ OLDSAX - XML_
PARSE_ PEDANTIC - XML_
PARSE_ RECOVER - libxml2
xmlParserOptionbits (numeric identity). - XML_
PARSE_ SAX1 - XML_
PARSE_ SKIP_ IDS - XML_
PARSE_ UNZIP - XML_
PARSE_ XINCLUDE - XML_
SAVE_ AS_ HTML - XML_
SAVE_ AS_ XML - XML_
SAVE_ EMPTY - XML_
SAVE_ FORMAT - libxml2
xmlSaveOptionbits. - XML_
SAVE_ INDENT - XML_
SAVE_ NO_ DECL - XML_
SAVE_ NO_ EMPTY - XML_
SAVE_ NO_ INDENT - XML_
SAVE_ NO_ XHTML - XML_
SAVE_ WSNONSIG - XML_
SAVE_ XHTML - XML_
WAR_ NS_ URI_ RELATIVE - XPATH_
BOOLEAN - XPATH_
NODESET - XPATH_
NUMBER - XPATH_
STRING - XPATH_
UNDEFINED - libxml2
xmlXPathObjectType.
Traits§
- SaxHandler
- SAX2 handler. Default methods are no-ops so a recorder can override a subset.
Functions§
- decode_
html_ text - Expand character references in HTML text.
- default_
parse_ options - Safe defaults: no network, no XXE.
- event_
to_ xmllint_ debug - Format one event the way pinned xmllint
--saxprints it. - html_
entity - Look up a named character reference.
Noneif it is not an HTML5 name. - html_
read_ doc htmlReadDoc.- html_
read_ file htmlReadFile.- html_
read_ memory htmlReadMemory.- is_
pubid_ char - PubidChar ::= #x20 | #xD | #xA | [a-zA-Z0-9] | [-’()+,./:=?;!*#@$_%]
- merge_
dtd - Merge
srcintodst(external subset onto internal). - parse_
dtd_ subset - Parse a DTD internal/external subset into declarations.
- parse_
external_ subset - Parse an external subset, where conditional sections are legal and a parameter entity may supply part of a declaration.
- xml_
c14n_ 1_ 0 - Inclusive C14N 1.0 without comments.
- xml_
c14n_ doc_ dump_ memory xmlC14NDocDumpMemory.- xml_
catalog_ cleanup xmlCatalogCleanup— no-op.- xml_
char_ in_ range - Binary search matching
xmlCharInRangeinchvalid.c. - xml_
cleanup_ parser xmlCleanupParser— no-op.- xml_
convert_ to_ utf8 - Convert
inputto UTF-8.hintis theencodingargument toxmlReadMemory. - xml_
create_ push_ parser_ ctxt xmlCreatePushParserCtxt.- xml_
ctxt_ get_ document xmlCtxtGetDocument.- xml_
ctxt_ get_ last_ error xmlCtxtGetLastError.- xml_
ctxt_ get_ options xmlCtxtGetOptions.- xml_
ctxt_ read_ memory xmlCtxtReadMemory.- xml_
ctxt_ reset xmlCtxtReset.- xml_
ctxt_ set_ options xmlCtxtSetOptions.- xml_
ctxt_ use_ options xmlCtxtUseOptions.- xml_
detect_ char_ encoding xmlDetectCharEncoding— XML 1.0 appendix F plus libxml2’s UTF-16 extras.- xml_
doc_ dump_ format_ memory xmlDocDumpFormatMemory.- xml_
doc_ dump_ memory xmlDocDumpMemory.- xml_
exc_ c14n_ 1_ 0 - Exclusive C14N 1.0 without comments.
- xml_
get_ char_ encoding_ name xmlGetCharEncodingName.- xml_
init_ parser xmlInitParser— no process-global ctor in Rust.- xml_
initialize_ catalog xmlInitializeCatalog— no-op (no process-global catalog).- xml_
is_ base_ char xmlIsBaseCharQ.- xml_
is_ blank xmlIsBlankQ.- xml_
is_ char xmlIsCharQ.- xml_
is_ combining xmlIsCombiningQ.- xml_
is_ digit xmlIsDigitQ.- xml_
is_ extender xmlIsExtenderQ.- xml_
is_ ideographic xmlIsIdeographicQ.- xml_
is_ letter IS_LETTER.- xml_
is_ name_ char - XML 1.0 5th edition NameChar (default).
- xml_
is_ name_ start_ char - XML 1.0 5th edition NameStartChar (default).
old10uses Letter | ‘_’ | ‘:’. - xml_
is_ pubid_ char xmlIsPubidCharQ.- xml_
new_ parser_ ctxt xmlNewParserCtxt.- xml_
new_ text_ writer_ memory xmlNewTextWriterMemory.- xml_
node_ dump xmlNodeDumpof a subtree (no XML declaration).- xml_
parse_ char_ encoding xmlParseCharEncoding.- xml_
parse_ chunk xmlParseChunk.terminate != 0finishes the document.- xml_
parse_ dtd xmlParseDTD— parse a DTD from memory (caller already loaded the bytes).- xml_
read_ doc xmlReadDoc.- xml_
read_ file xmlReadFile.- xml_
read_ io xmlReadIO— caller-supplied read callback, no network.- xml_
read_ memory xmlReadMemory.- xml_
reader_ for_ doc xmlReaderForDoc.- xml_
reader_ for_ memory xmlReaderForMemory.- xml_
relaxng_ validate_ doc xmlRelaxNGParse+xmlRelaxNGValidateDoc.- xml_
save_ doc xmlSaveDoc/xmlDocDumpMemorywithxmlSaveOptionbits.- xml_
sax2_ init_ default_ sax_ handler xmlSAX2InitDefaultSAXHandleris a no-op beyond constructing a recorder.- xml_
sax_ parse_ memory - Parse and record SAX events (for the event-exact gate).
- xml_
sax_ version xmlSAXVersion— we speak SAX2.- xml_
schema_ validate_ doc xmlSchemaValidateDoc.- xml_
schematron_ validate_ doc xmlSchematronValidateDoc.- xml_
validate_ document xmlValidateDocumentagainst the document’s attached DTD.- xml_
validate_ dtd xmlValidateDtd.- xml_
xinclude_ process xmlXIncludeProcesswith a caller resource loader.- xml_
xpath_ cast_ to_ boolean xmlXPathCastToBoolean.- xml_
xpath_ cast_ to_ number xmlXPathCastToNumber.- xml_
xpath_ cast_ to_ string xmlXPathCastToString.- xml_
xpath_ cmp_ nodes xmlXPathCmpNodes.- xml_
xpath_ compile - xml_
xpath_ compiled_ eval xmlXPathCompiledEval.- xml_
xpath_ debug_ dump - Dump matching libxml2
xmlXPathDebugDumpObjectused byxmllint --xpath/ testXPath. - xml_
xpath_ eval xmlXPathEval/xmlXPathEvalExpression.- xml_
xpath_ is_ inf xmlXPathIsInf.- xml_
xpath_ is_ nan xmlXPathIsNaN.- xml_
xpath_ order_ doc_ elems xmlXPathOrderDocElems— walk document order (preorder).- xml_
xpath_ print_ lint xmllint --xpathscalar printer (%0g/ true / false / string).