これらのライブラリは、JavaScript 環境(Node.js およびブラウザ)で XML データの解析、検証、生成を行うためのツールです。実装アプローチは大きく分けて 2 つあります。一つは C 言語ライブラリ(libxml2)をネイティブバインディングで利用する方式、もう一つは純粋な JavaScript で実装された方式です。前者は機能面(XPath、XSD 検証など)で強力ですが環境依存があり、後者は移植性が高くセットアップが容易です。プロジェクトの要件(速度、セキュリティ、機能、デプロイ環境)に応じて適切な選択が必要です。
JavaScript で XML を扱う場合、目的によって選ぶべきライブラリが全く異なります。単にデータを読み込みたいだけなのか、複雑な検証が必要なのか、それとも XML を生成したいのか。ここでは 6 つの主要パッケージを、実装方式、API の使い勝手、機能、そして保守性の観点から比較します。
ライブラリ選びで最初に確認すべきは、ネイティブコード(C 言語など)に依存しているかどうかです。これがデプロイの難易度と実行速度に直結します。
libxmljs と libxmljs2 は、C 言語で書かれた高性能な XML ライブラリ「libxml2」を Node.js から呼び出すネイティブバインディングです。
// libxmljs2: ネイティブモジュールの読み込みが必要
const libxmljs = require("libxmljs2");
const xmlDoc = libxmljs.parseXml(xmlString);
fast-xml-parser、xml2js、xmldom、xmlbuilder は、純粋な JavaScript で書かれています。
// fast-xml-parser: 追加ビルド不要でそのまま動作
const { XMLParser } = require("fast-xml-parser");
const parser = new XMLParser();
const result = parser.parse(xmlString);
非同期処理が主流の Node.js において、API が同期か非同期かはコードの書きやすさに影響します。
xml2js は伝統的にコールバックベースの API を採用しています。
async/await との相性が悪く、コードがネストしがちです。// xml2js: コールバックベース(Promise 化が必要)
const parseString = require('xml2js').parseString;
parseString(xml, (err, result) => {
if (err) throw err;
console.log(result);
});
fast-xml-parser は同期処理で結果を返します。
async/await の流れの中で自然に扱え、エラーハンドリングも try-catch で完結します。// fast-xml-parser: 同期で結果が得られる
try {
const result = parser.parse(xmlString);
console.log(result);
} catch (e) {
console.error(e);
}
libxmljs2 も同期処理を提供しますが、重い処理ではイベントループをブロックする可能性があります。
// libxmljs2: 同期パース
const doc = libxmljs.parseXml(xmlString);
xmldom はブラウザの DOM API に合わせた同期インターフェースを持ちます。
// xmldom: DOMParser を使用
const { DOMParser } = require('xmldom');
const doc = new DOMParser().parseFromString(xmlString, 'text/xml');
単なるパースを超えて、特定のノード検索や形式検証が必要かどうかで選択肢が絞られます。
libxmljs2 はこの分野で最強です。
// libxmljs2: XPath 検索と検証
const root = libxmljs.parseXml(xml);
const nodes = root.find('//book/title');
const isValid = root.validate(schemaDoc);
fast-xml-parser はバージョン 4 以降で簡易的な XPath 様の機能を持ちますが、完全な準拠ではありません。
// fast-xml-parser: 簡易的なアクセス(完全な XPath ではない)
// 基本的に JSON オブジェクトとしてアクセスするため、配列やオブジェクトを辿る
const title = result.library.book.title;
xml2js と xmldom は、XPath 機能を本体に含んでいません。
xpath などのライブラリを組み合わせる必要があります。// xmldom + xpath: 別ライブラリとの組み合わせが必要
const xpath = require('xpath');
const nodes = xpath.select("//title", doc);
XML を解析するだけでなく、新しく作成する必要がある場合、xmlbuilder が役立ちます。
xmlbuilder は XML 生成に特化しています。
// xmlbuilder: チェーンで構築
const builder = require('xmlbuilder');
const xml = builder.create('library')
.ele('book').att('id', '123').ele('title').txt('JS Guide').up()
.end({ pretty: true });
fast-xml-parser も JSON から XML への変換(Builder)機能を持っています。
// fast-xml-parser: JSON から XML へ変換
const { XMLBuilder } = require("fast-xml-parser");
const builder = new XMLBuilder();
const xmlContent = builder.build(jsonObject);
libxmljs2 でもノードを追加して生成できますが、コード量は多くなりがちです。
// libxmljs2: プログラムによるノード追加
const doc = new libxmljs.Document();
const root = doc.node('library');
const book = root.node('book').attr('id', '123');
オープンソースライブラリを選ぶ際、メンテナンス状況はセキュリティに直結します。
libxmljs と xmldom(元パッケージ)は注意が必要です。
libxmljs は長期間更新が停滞しており、libxmljs2 への移行が公式に推奨されています。xmldom もセキュリティ脆弱性の修正が停滞した時期があり、現在は @xmldom/xmldom への移行がアナウンスされています。fast-xml-parser と libxmljs2 は現在アクティブにメンテナンスされています。
| 機能 | fast-xml-parser | libxmljs2 | xml2js | xmlbuilder | xmldom |
|---|---|---|---|---|---|
| 実装 | 純粋な JS | ネイティブ | 純粋な JS | 純粋な JS | 純粋な JS |
| 解析速度 | ⚡ 非常に速い | ⚡ 速い | 🐢 普通 | N/A | 🐢 普通 |
| XPath 対応 | 一部 | ✅ 完全 | ❌ (要追加) | ❌ | ❌ (要追加) |
| XML 生成 | ✅ 可能 | ✅ 可能 | ❌ (別版あり) | ✅ 特化 | ❌ |
| 保守状況 | ✅ アクティブ | ✅ アクティブ | ⚠️ 維持モード | ⚠️ 維持モード | ❌ 非推奨 |
| 環境依存 | なし | あり (ビルド必要) | なし | なし | なし |
プロジェクトの要件に応じて、以下のように選択するのが合理的です。
モダンな Web アプリやサーバーレス環境
fast-xml-parser を選んでください。インストールが簡単で高速、かつ解析と生成の両方をカバーしています。最もバランスが良い選択肢です。高度な検証や複雑なクエリが必要なエンタープライズシステム
libxmljs2 一択です。XSD 検証や XPath が必要な場合、純粋な JS ライブラリでは実装コストが高すぎます。ネイティブコンパイルの環境構築コストを許容できる場合に使用します。XML 生成が主目的の場合
xmlbuilder が適しています。ただし、解析も必要なら fast-xml-parser との併用、あるいは fast-xml-parser 単体での完結を検討します。避けるべき選択肢
libxmljs と xmldom(無印)は、セキュリティと保守性の観点から新規プロジェクトでは使用しないでください。既存システムで使われている場合は、移行計画を立てることを強く推奨します。XML 処理はアプリケーションの堅牢性に直結する部分です。一時的な導入のしやすさだけでなく、長期的なメンテナンス性とセキュリティを最優先してライブラリを選定してください。
純粋な JavaScript で実装されており、インストールが容易で動作が非常に高速です。XML を JSON に変換する処理や、その逆の変換が必要なモダンなプロジェクトに最適です。ネイティブ依存がないため、サーバーレス環境やブラウザでの利用にも適しています。
このパッケージは現在メンテナンスが停止しており、新規プロジェクトでの使用は推奨されません。セキュリティ修正や Node.js の新バージョンへの対応が期待できないため、代替案を検討すべきです。
libxmljs のアクティブにメンテナンスされているフォーク版です。XPath クエリや XSD によるスキーマ検証など、高度な XML 機能が必要な場合に選択します。ただし、ネイティブコンパイルが必要なため、デプロイ環境でビルドツールチェーンが整っている必要があります。
長年利用されている定番のライブラリで、XML を JavaScript オブジェクトに変換する実績があります。既存のレガシーシステムとの互換性を保つ場合や、シンプルな変換処理で十分な場合に有用です。ただし、純粋な JS 実装の中では処理速度で劣る場合があります。
XML 構造をプログラムで構築・生成することに特化したライブラリです。他のパーサーと組み合わせて利用されることが多く、複雑な XML ドキュメントをコード上で組み立てる必要がある場合に適しています。
W3C DOM 仕様を JavaScript で実装したものですが、元のパッケージはセキュリティ問題やメンテナンスの観点から非推奨となっています。DOM API が必要な場合は、公式に推奨されているフォーク版(@xmldom/xmldom)の使用を検討してください。
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
Flexible-XML-Parser is 2 times faster than this library and allows to deal with incomplete XML/HTML. Output is highly customizable. Build whatever you want. So if you're fine with some extra configuration then try it out.
Please join Discord community for pre release announcements and discussions. This will prevent us to release breaking changes.
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]
