fast-xml-parser、libxmljs、xml2js、xmlbuilder、xmlbuilder2 は、JavaScript 環境で XML データの解析(パース)や生成(ビルド)を行うための主要なライブラリです。xml2js と fast-xml-parser は XML を JavaScript オブジェクトに変換する解析に特化しており、xmlbuilder シリーズは XML 構造を構築することに重点を置いています。libxmljs は C 言語のライブラリをラップしており高速ですが、ネイティブコンパイルが必要です。プロジェクトの環境(ブラウザ、Node.js、サーバーレス)と、速度や機能の要件に応じて適切なツールを選択する必要があります。
JavaScript で XML を扱う場合、目的が「解析(Parsing)」なのか「生成(Building)」なのか、そして実行環境が「ブラウザ」なのか「Node.js」なのかによって、選ぶべきライブラリが明確に分かれます。fast-xml-parser、libxmljs、xml2js、xmlbuilder、xmlbuilder2 はそれぞれ異なるアプローチを取っており、一長一短があります。本稿では、実務で直面する技術的なトレードオフに焦点を当て、各ライブラリの特性を比較します。
XML 解析の速度と環境依存性は、ライブラリ選びの最大の分岐点です。
fast-xml-parser は、純粋な JavaScript(TypeScript)で実装されています。
// fast-xml-parser: 純粋な JS で高速解析
const { XMLParser } = require("fast-xml-parser");
const parser = new XMLParser();
const result = parser.parse("<root><item id='1'>Text</item></root>");
console.log(result);
// { root: { item: { '#text': 'Text', '@_id': '1' } } }
libxmljs は、C 言語で書かれた高性能ライブラリ libxml2 のラッパーです。
node-gyp によるネイティブコンパイルが必要であり、ビルド環境がないサーバーレス環境や Windows 環境ではトラブルになりやすいです。// libxmljs: ネイティブバインディングによる高速処理
const libxml = require("libxmljs");
const xmlDoc = libxml.parseXmlString("<root><item id='1'>Text</item></root>");
const item = xmlDoc.get("//item");
console.log(item.text()); // "Text"
console.log(item.attr("id").value()); // "1"
xml2js は、長年使われている純粋な JavaScript ライブラリです。
fast-xml-parser に比べると解析速度は劣りますが、機能は十分です。// xml2js: 安定した非同期解析
const { parseStringPromise } = require("xml2js");
const xml = "<root><item id='1'>Text</item></root>";
async function parse() {
const result = await parseStringPromise(xml);
console.log(result);
// { root: { item: [ { $: { id: '1' }, _: 'Text' } ] } }
}
XML を構築する際、コードの可読性とメンテナンス性は重要です。
xmlbuilder は、長らく標準として使われてきましたが、現在はメンテナンスモードに入っています。
xmlbuilder2 への移行を検討すべきです。// xmlbuilder: 従来のチェーン操作(レガシー)
const builder = require("xmlbuilder");
const xml = builder.create("root")
.ele("item", { id: "1" })
.txt("Text")
.end({ pretty: true });
console.log(xml);
xmlbuilder2 は、xmlbuilder の問題点を解消するために書き直されたモダンなライブラリです。
convert)機能も強化されています。// xmlbuilder2: モダンな API と変換機能
const { create } = require("xmlbuilder2");
const doc = create({ encoding: "UTF-8" })
.ele("root")
.ele("item", { id: "1" }).txt("Text")
.up()
.end({ prettyPrint: true });
console.log(doc);
外部から受け取る XML データを扱う場合、セキュリティと形式の検証が不可欠です。
fast-xml-parser は、解析と同時にバリデーションを行うオプションを提供します。
// fast-xml-parser: 内蔵バリデーション
const { XMLParser, XMLValidator } = require("fast-xml-parser");
const validation = XMLValidator.validate(xmlString);
if (validation === true) {
const parser = new XMLParser();
const result = parser.parse(xmlString);
}
libxmljs は、XSD(XML Schema Definition)による厳密な検証が可能です。
// libxmljs: XSD によるスキーマ検証
const libxml = require("libxmljs");
const xsd = libxml.parseXmlString(xsdSchemaString);
const xml = libxml.parseXmlString(xmlString);
const isValid = xml.validate(xsd);
console.log(isValid); // true or false
xml2js には、標準では厳密なバリデーション機能は含まれていません。
// xml2js: 基本的なエラーハンドリング
const { parseStringPromise } = require("xml2js");
parseStringPromise(xmlString)
.then(result => { /* 成功 */ })
.catch(err => { /* 構文エラーなどをキャッチ */ });
実行環境によって、選択肢が狭まることがあります。
fast-xml-parser: 依存関係が少なく純粋な JS なので、ブラウザ、Node.js、Cloudflare Workers など、あらゆる環境で動作します。フロントエンドで XML を扱うなら第一候補です。libxmljs: Node.js のみです。ネイティブコードを含むため、ブラウザでは動作せず、サーバーレス環境でもコンパイル済みバイナリの提供がない限り使用できません。xml2js / xmlbuilder / xmlbuilder2: 純粋な JS なので、ブラウザと Node.js の両方で動作します。ただし、xmlbuilder は古い設計のため、モダンなビルドツールとの相性で警告が出ることがあります。処理のフロー設計にも影響します。
fast-xml-parser: 基本的に同期処理です。シンプルで制御しやすいですが、超大規模なデータを扱う際はイベントループをブロックする可能性があります。xml2js: 非同期処理(Promise/Callback)が基本です。大きなファイルのストリーム処理に適しており、サーバーのレスポンスを阻害しにくい設計です。libxmljs: 基本的に同期処理ですが、高速なネイティブコードなので、JS 製のものよりブロックの影響は小さい傾向にあります。// xml2js: ストリーム処理の例(非同期)
const { parseString } = require("xml2js");
const fs = require("fs");
const stream = fs.createReadStream("large-file.xml");
const parser = new require("xml2js").Parser();
parser.parseStream(stream, (err, result) => {
// 完了時にコールバック
});
| 要件 | 推奨パッケージ | 理由 |
|---|---|---|
| 速度最優先 (Node.js) | libxmljs | ネイティブコードにより最速。ただしコンパイル必要。 |
| 速度と互換性のバランス | fast-xml-parser | 純粋な JS で非常に速く、環境を選ばない。 |
| 安定性と実績 | xml2js | 長年の実績があり、コミュニティサポートが厚い。 |
| XML 生成 (新規) | xmlbuilder2 | モダンな API で、型安全かつ保守しやすい。 |
| XML 生成 (保守) | xmlbuilder | 既存コードの資産がある場合のみ。新規は避ける。 |
| ブラウザ利用 | fast-xml-parser | ネイティブ依存がなく、バンドルサイズも比較的軽量。 |
| 厳密な検証 (XSD) | libxmljs | XSD 検証機能が強力。 |
fast-xml-parser は、純粋な JavaScript で動作しながらも libxmljs に匹敵する速度を出せるため、多くのケースで最適な選択となります。特に、コンパイルの手間を避けたい、あるいはブラウザでも動かしたい場合には、これ一択と言えるでしょう。
libxmljs は、サーバーサイドで巨大な XML を処理し、かつ XSD 検証などの高度な機能が必要な場合にのみ検討します。導入コスト(ビルド環境)に見合うメリットがある場面は限られています。
xmlbuilder2 は、XML 生成が必要な場合の現代的な標準です。古い xmlbuilder を使っているプロジェクトは、技術的負債を減らすために移行を検討する価値があります。
xml2js は、まだ現役で使われていますが、新規プロジェクトでは fast-xml-parser の方がパフォーマンスと機能面で優れていることが多いです。
XML 処理は地味なタスクに見えますが、ライブラリの選択がセキュリティやパフォーマンスに直結します。プロジェクトの環境と要件に合わせて、適切なツールを選びましょう。
純粋な JavaScript で書かれており、コンパイル不要で動作するため、ブラウザやサーバーレス環境でも問題なく動作します。解析速度が非常に速く、バリデーション機能も内蔵しているため、高性能かつセキュリティを重視する現代的なプロジェクトに最適です。
C 言語の libxml2 をラップしているため、解析・変換速度が最も高速です。ただし、ネイティブモジュールのコンパイル(node-gyp)が必要となるため、ビルド環境が整っている Node.js サーバー向けです。ブラウザやコンパイル環境のないデプロイ先には向きません。
長年実績のある定番ライブラリで、コミュニティによるサポートが厚いです。API が安定しており、既存プロジェクトの保守や、特別な高速性が求められない一般的な Node.js アプリケーションでの利用に適しています。
XML 生成に特化した古いライブラリです。現在は xmlbuilder2 への移行が推奨されており、新規プロジェクトでの採用は避けるべきです。既存のレガシーコードの保守時にのみ検討します。
xmlbuilder の後継として設計されたモダンなライブラリです。XML 生成だけでなく変換機能も強化されており、チェーン操作による直感的な記述が可能です。新規で XML 構築機能が必要な場合に選択すべきパッケージです。
Validate XML, Parse XML to JS Object, or Build XML from JS Object without C/C++ based libraries and no callback.
It can handle big files (tested up to 100mb). XML Entities, HTML entities, and DOCTYPE entites are supported. Unpaired tags (Eg <br> in HTML), stop nodes (Eg <script> in HTML) are supported. It can also preserve Order of tags in JS object

Sponsor this project

This is a donation. No goods or services are expected in return. Any requests for refunds for those purposes will be rejected.
The list of users are mostly published by Github or communicated directly. Feel free to contact if you find any information wrong.
To use as package dependency
$ npm install fast-xml-parser
or
$ yarn add fast-xml-parser
To use as system command
$ npm install fast-xml-parser -g
To use it on a webpage include it from a CDN
Example
As CLI command
$ fxparser some.xml
In a node js project
const { XMLParser, XMLBuilder, XMLValidator} = require("fast-xml-parser");
const parser = new XMLParser();
let jObj = parser.parse(XMLdata);
const builder = new XMLBuilder();
const xmlContent = builder.build(jObj);
In a HTML page
<script src="path/to/fxp.min.js"></script>
:
<script>
const parser = new fxparser.XMLParser();
parser.parse(xmlContent);
</script>
Bundle size
| Bundle Name | Size |
|---|---|
| fxbuilder.min.js | 6.5K |
| fxparser.min.js | 20K |
| fxp.min.js | 26K |
| fxvalidator.min.js | 5.7K |
| v3 | v4 and v5 | v6 |
| documents |
note:
negative means error
* Y-axis: requests per second
Usage Trend of fast-xml-parser
This project exists thanks to all the people who contribute. [Contribute].
Thank you to all our backers! 🙏 [Become a backer]
