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
👀 Смотрите также

Storybloq: трекер проектов для Claude Code с Mac-приложением, CLI и MCP
Storybloq — это бесплатный трекер проектов с открытым исходным кодом, который живёт в .story/ внутри вашего репозитория. Он включает приложение для Mac (App Store), CLI и MCP-сервер, предоставляющий задачи, тикеты и передачу сессий Claude Code.

Conduid.com индексирует более 23 000 MCP-серверов в поисковый каталог.
Conduid.com агрегирует MCP-серверы из 11 источников, удаляет дубликаты и предоставляет поиск, категории и оценки доверия на основе активности на GitHub, качества документации и признаков поддержки.

Netflix выпускает VOID: модель удаления объектов и взаимодействий на видео на Hugging Face.
Netflix выпустила VOID — модель видеоинпейнтинга, которая удаляет объекты из видео вместе со всеми физическими взаимодействиями, которые они вызывают, включая падающие предметы и смещённые объекты. Для работы модели требуется видеокарта с 40 ГБ+ видеопамяти, используется квадмаска с двумя чекпоинтами для разных уровней доработки.

Навык тестирования SwiftUI с открытым исходным кодом для Claude Code использует функцию Computer Use для визуального тестирования приложений.
Инструмент с открытым исходным кодом для Claude Code под названием /ios-test проводит визуальное тестирование приложений SwiftUI с использованием функции Computer Use. Агент находит файлы .xcodeproj, собирает приложение в симуляторе, затем проходит через каждый экран, нажимая кнопки и переходя по ссылкам, как настоящий пользователь.