Xmloxide: AI 에이전트 지원으로 생성된 libxml2의 Rust 재구현

✍️ OpenClawRadar📅 게시일: March 1, 2026🔗 Source
Xmloxide: AI 에이전트 지원으로 생성된 libxml2의 Rust 재구현
Ad

Xmloxide란 무엇인가요?

Xmloxide는 XML 및 HTML 문서를 파싱, 생성, 조작하는 데 널리 사용되는 C 라이브러리인 libxml2를 순수 Rust로 재구현한 프로젝트입니다. 이 프로젝트는 2025년 12월에 공식적으로 유지 관리가 중단되고 알려진 보안 문제가 발생한 libxml2 이후에 만들어졌습니다. 개발자는 Claude Code를 사용하여 AI 에이전트가 기존 테스트 스위트를 통과할 때까지 작업하도록 하여 라이브러리를 재현했습니다.

주요 기능 및 능력

  • 메모리 안전 — 공개 API에서 안전하지 않은 코드 없이 아레나 기반 트리 제공
  • 표준 준수 — 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++ 프로젝트에 내장하기 위한 헤더 파일(include/xmloxide.h)을 포함한 완전한 C API
  • 최소 의존성 — encoding_rs만 사용 (라이브러리는 다른 의존성 없음; clap은 CLI 전용)

성능 및 호환성

대부분의 파싱 작업에서 libxml2와 유사한 성능을 보이며 직렬화에서는 더 나은 성능을 제공합니다. 이 라이브러리는 호환성 스위트와 W3C XML 적합성 테스트 스위트를 모두 통과합니다.

Ad

코드 예제

기본 파싱:

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

Ad

👀 See Also

로그 감소기 MCP 서버, 클로드 코드가 로그를 읽을 때 토큰 사용량 절감
Tools

로그 감소기 MCP 서버, 클로드 코드가 로그를 읽을 때 토큰 사용량 절감

Log Reducer는 로그 파일을 서버 측에서 처리하여 Claude Code에 축소된 출력만 전송하는 MCP 서버로, 원시 로그가 컨텍스트 창에 들어가는 것을 방지합니다. 19가지 결정론적 변환을 적용하여 로그를 50-90% 압축하며, 2,000줄의 로그는 세션에서 20,000개 이상의 토큰이 제거되는 것을 의미합니다.

OpenClawRadar
Rivet Actors가 SQLite 저장소를 추가했습니다: 에이전트, 테넌트 또는 문서별로 하나의 데이터베이스를 제공합니다.
Tools

Rivet Actors가 SQLite 저장소를 추가했습니다: 에이전트, 테넌트 또는 문서별로 하나의 데이터베이스를 제공합니다.

Rivet Actors는 이제 각 액터가 자체 SQLite 데이터베이스를 갖는 SQLite 스토리지를 지원하여, AI 에이전트, 멀티테넌트 SaaS, 협업 문서 또는 사용자별 격리를 위한 수백만 개의 독립적인 데이터베이스를 가능하게 합니다.

OpenClawRadar
🦀
Tools

클로드 코드 대 코드스: 36개 vs 28개 파일, $2.50 vs $2.04, 무한 루프 포착 — 실제 비교

한 개발자가 Claude Code와 Codex (Cursor)에서 동일한 두 작업(PR 분류 봇, 실시간 코드 리뷰 UI)을 실행했습니다. 결과: 36개 파일 vs 28개 파일, $2.50 vs $2.04 비용, Claude가 더 적은 TypeScript 오류를 생성했고, Codex는 무한 React 루프가 있었습니다.

OpenClawRadar
클로드가 pywikibot을 임포트하는 대신 3,000줄의 코드를 작성한 사례 — AI 에이전트가 기존 라이브러리를 무시한 사례 연구
Tools

클로드가 pywikibot을 임포트하는 대신 3,000줄의 코드를 작성한 사례 — AI 에이전트가 기존 라이브러리를 무시한 사례 연구

한 개발자가 Claude Code(Opus 4.7)를 사용하여 Fandom 위키의 오타를 수정하는 작업을 맡겼다. 모델은 pywikibot, mwparserfromhell, RETF 규칙을 가져오는 대신 약 3,000줄의 Python 코드로 이를 재구현했다. 이 글은 이러한 현상이 발생하는 이유와 2분 만의 검색으로 코드베이스를 1,259줄로 줄인 방법을 탐구한다.

OpenClawRadar