Xmloxide: Реализация libxml2 на Rust, созданная с помощью ИИ-агента

Что такое Xmloxide?
Xmloxide — это чистая реализация на языке Rust библиотеки libxml2, широко используемой C-библиотеки для парсинга, создания и манипулирования XML и HTML документами. Проект был создан после того, как libxml2 официально перестала поддерживаться в декабре 2025 года и имела известные проблемы с безопасностью. Разработчик использовал Claude Code для воспроизведения библиотеки, поручив ИИ-агенту работать над существующими тестовыми наборами до тех пор, пока они не были пройдены.
Ключевые особенности и возможности
- Безопасность памяти — древовидная структура на основе арены без небезопасного кода в публичном API
- Соответствие стандартам — 100% прохождение набора тестов на соответствие W3C XML (1727/1727 применимых тестов)
- Восстановление после ошибок — парсинг некорректного XML с получением пригодного дерева, как в libxml2
- Несколько API для парсинга — DOM дерево, потоковый SAX2, pull-парсер XmlReader, push/инкрементальный
- HTML парсер — устойчивый к ошибкам парсинг HTML 4.01 с авто-закрытием и пустыми элементами
- XPath 1.0 — полный парсер и вычислитель выражений со всеми основными функциями
- Валидация — DTD, RelaxNG и XML Schema (XSD)
- Канонический XML — сериализация C14N 1.0 и Exclusive C14N
- XInclude — обработка включения документов
- XML каталоги — OASIS XML Catalogs для разрешения URI
- CLI инструмент xmllint — утилита командной строки для парсинга, валидации и запросов к XML
- Отсутствие копирования где возможно — интернирование строк для быстрых сравнений
- Отсутствие глобального состояния — каждый документ самодостаточен и Send + Sync
- C/C++ FFI — полный C API с заголовочным файлом (include/xmloxide.h) для встраивания в C/C++ проекты
- Минимальные зависимости — только encoding_rs (библиотека не имеет других зависимостей; clap только для CLI)
Производительность и совместимость
Производительность сравнима с libxml2 для большинства операций парсинга и лучше при сериализации. Библиотека проходит набор тестов на совместимость, а также набор тестов на соответствие W3C XML.
Примеры кода
Базовый парсинг:
use xmloxide::Document;
let doc = Document::parse_str("<root><child>Hello</child></root>").unwrap();
let root = doc.root_element().unwrap();
assert_eq!(doc.node_name(root), Some("root"));
assert_eq!(doc.text_content(root), "Hello");
Сериализация:
use xmloxide::Document;
use xmloxide::serial::serialize;
let doc = Document::parse_str("<root><child>Hello</child></root>").unwrap();
let xml = serialize(&doc);
assert_eq!(xml, "<root><child>Hello</child></root>");
XPath запросы:
use xmloxide::Document;
use xmloxide::xpath::{evaluate, XPathValue};
let doc = Document::parse_str("<library><book><title>Rust</title></book></library>").unwrap();
let root = doc.root_element().unwrap();
let result = evaluate(&doc, root, "count(book)").unwrap();
assert_eq!(result.to_number(), 1.0);
Потоковый SAX2:
use xmloxide::sax::{parse_sax, SaxHandler, DefaultHandler};
use xmloxide::parser::ParseOptions;
struct MyHandler;
impl SaxHandler for MyHandler {
fn start_element(&mut self, name: &str, _: Option<&str>, _: Option<&str>, _: &[(String, String, Option<String>, Option<String>)]) {
println!("Element: {name}");
}
}
parse_sax("<root><child/></root>", &ParseOptions::default(), &mut MyHandler).unwrap();
HTML парсинг:
use xmloxide::html::parse_html;
let doc = parse_html("<p>Hello <br> World").unwrap();
let root = doc.root_element().unwrap();
assert_eq!(doc.node_name(root), Some("html"));
Восстановление после ошибок:
use xmloxide::parser::{parse_str_with_options, ParseOptions};
let opts = ParseOptions::default().recover(true);
let doc = parse_str_with_options("<root><unclosed>", &opts).unwrap();
for diag in &doc.diagnostics {
eprintln!("{}", diag);
}
Использование CLI
Инструмент командной строки xmllint предоставляет:
# Парсинг и красивое форматирование
xmllint --format document.xml
Валидация по схеме
xmllint --schema schema.xsd document.xml
xmllint --relaxng schema.rng document.xml
xmllint --dtdvalid
Контекст разработки с ИИ-агентом
Разработчик экспериментировал с воспроизведением Redis и SQLite с помощью Claude Code, прежде чем взяться за libxml2. Подход заключался в том, чтобы поручить ИИ-агенту работать над проектами до тех пор, пока существующие тестовые наборы не будут пройдены. Это демонстрирует, как кодирующие агенты могут быстро итеративно работать при наличии тестового набора, потенциально решая проблемы поддержки устаревшего кода.
📖 Read the full source: HN AI Agents
👀 Смотрите также

PocketBot: ИИ компилирует автоматизации в JavaScript для экономичного, детерминированного планирования.
PocketBot решает проблемы стоимости API и оборудования, компилируя запросы на естественном языке в автономные JavaScript-скрипты, которые запускаются по расписанию без вызовов LLM во время выполнения. Инструмент использует ИИ только один раз для написания кода, а затем выполняет его детерминированно с более чем 20 интеграциями, включая Google Suite, Slack и Notion.

Управление кодом Claude удаленно: Продолжение локальных сессий с любого устройства
Claude Code Remote Control позволяет продолжить локальные сессии Claude Code с других устройств, таких как телефоны или браузеры, сохраняя всё запущенным на вашем компьютере. Доступно в режиме исследовательского предпросмотра для планов Pro и Max, требует настройки аутентификации и доверия к рабочему пространству.

Люмир: Генерация дашбордов через Claude с автоматизацией на Python и Streamlit
Lumyr — это инструмент, который создаёт живые, доступные для общего доступа дашборды из описаний на простом английском языке, используя Claude для генерации дашбордов и автоматизации работы с Python и Streamlit. Пользователям не нужно писать код на Python, открывать Streamlit, разворачивать приложения, настраивать хостинг или управлять инфраструктурой.

Мастерство Клода в Коде: Опенсорсная система конфигурации добавляет постоянную память и отобранные навыки в CLI Claude Code
Claude Code Mastery — это система конфигурации с открытым исходным кодом, которая добавляет постоянную память между сеансами, интеллектуальные хуки жизненного цикла и более 26 тщательно отобранных навыков в CLI Claude Code. Она включает в себя 6-файловый Memory Bank для каждого проекта, запускатор с нулевой конфигурацией и кроссплатформенную поддержку.