Xmloxide: AIエージェント支援で作成されたlibxml2のRust再実装

Xmloxideとは?
Xmloxideは、XMLおよびHTMLドキュメントの解析、作成、操作に広く使用されているCライブラリであるlibxml2を、純粋なRustで再実装したプロジェクトです。このプロジェクトは、libxml2が2025年12月に公式にメンテナンスが停止し、既知のセキュリティ問題が残された後に作成されました。開発者はClaude Codeを使用し、AIエージェントに既存のテストスイートを通過するまで作業させることで、このライブラリを再現しました。
主な機能と能力
- メモリセーフ — アリーナベースのツリー構造で、公開APIにはunsafeコードがゼロ
- 準拠性 — W3C XML適合性テストスイートで100%の合格率(1727/1727の適用可能なテスト)
- エラー回復 — 不正な形式のXMLを解析し、libxml2と同様に使用可能なツリーを生成
- 複数の解析API — DOMツリー、SAX2ストリーミング、XmlReaderプル、プッシュ/インクリメンタル解析
- HTMLパーサー — エラートレラントなHTML 4.01解析で、自動クロージングと空要素に対応
- XPath 1.0 — すべてのコア関数を含む完全な式パーサーと評価器
- 検証 — DTD、RelaxNG、XMLスキーマ(XSD)検証
- 正規XML — C14N 1.0および排他的C14Nシリアライゼーション
- XInclude — ドキュメント包含処理
- XMLカタログ — URI解決のためのOASIS XMLカタログ
- xmllint CLI — XMLの解析、検証、クエリのためのコマンドラインツール
- 可能な限りゼロコピー — 高速比較のための文字列インターニング
- グローバル状態なし — 各ドキュメントは自己完結型でSend + Sync
- C/C++ FFI — C/C++プロジェクトへの組み込み用の完全なC APIとヘッダーファイル(include/xmloxide.h)
- 最小限の依存関係 — 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 CLIツールは以下を提供します:
# 解析して整形表示
xmllint --format document.xml
スキーマに対して検証
xmllint --schema schema.xsd document.xml
xmllint --relaxng schema.rng document.xml
xmllint --dtdvalid
AIエージェント開発の背景
開発者は、libxml2をターゲットにする前に、Claude CodeにRedisとSQLiteを再現させる実験を行いました。このアプローチでは、AIエージェントに既存のテストスイートを通過するまでプロジェクトに取り組ませることを含みました。これは、コーディングエージェントがテストスイートを与えられれば、レガシーコードのメンテナンス問題に対処するために迅速に反復できる可能性を示しています。
📖 完全なソースを読む: HN AI Agents
👀 See Also

Wisepanel MCPサーバーは、Claude CodeとCursorでマルチLLM審議を可能にします
Wisepanelは、Claude Code、Cursor、または任意のMCPクライアントから直接マルチエージェントの審議を実行できるMCPサーバーをリリースしました。ChatGPT、Claude、Gemini、Perplexityモデルを使用した発散的コンテキスト強化システムを採用しています。

オリー・ルーメン:Claude Code用オープンソースローカルセマンティック検索プラグイン
Ory Lumenは、Claude Codeのパフォーマンス問題を解決するためのプラグインです。Ollamaのコード埋め込みモデルとSQLite-vecのセマンティック検索を使用してコードベースをインデックス化し、大規模なコードベースでのClaude Codeの性能問題に対処します。このツールは無料でローカルのみ動作し、再現可能な結果を得るためのSWEスタイルのベンチマークテストハーネスを含んでいます。

キャディー:SlackベースのOpenClaw代替サービスが来週ローンチ
Caddieは、ローカルインストールやMCP設定が不要なSlackベースのOpenClawバージョンです。ユーザーはSlack App Directoryで60秒以内に認証し、Gmail、LinkedIn、CRM、カレンダー、その他100以上のツールにまたがるタスクを自動化するためのコマンドを入力します。

RescueBot: OpenClawボット向けのTelegramベースのバックアップおよび復元システム
RescueBotは、OpenClawボットの設定を自動的にスナップショットし、Telegramコマンドによるワンタップ復元を可能にする軽量スキルです。障害発生時のSSHアクセスを不要にします。