fast-xml-parser、xml-js、xml2js は、JavaScript 環境で XML データを JSON オブジェクトに変換したり、その逆を行ったりするためのライブラリです。これらは、レガシーな SOAP API との連携、サイトマップの生成、RSS フィードの読み込みなど、フロントエンドおよび Node.js バックエンドで XML を扱う必要がある場面で不可欠なツールです。各ライブラリは変換の速度、セキュリティ機能、API の設計思想に違いがあり、プロジェクトの要件に応じて適切な選択が必要です。
フロントエンド開発において、XML を直接扱う機会は昔に比べて減りましたが、仍然存在しています。サイトマップ、RSS フィード、一部の企業向け API、設定ファイルなど、依然として XML 形式のデータを処理する必要がある場面は少なくありません。fast-xml-parser、xml-js、xml2js は、この課題を解決する代表的なライブラリです。これらはそれぞれ異なる設計思想を持っており、パフォーマンス、セキュリティ、使いやすさに違いがあります。
XML を JavaScript オブジェクトに変換する際、各ライブラリは異なる API スタイルを採用しています。特に非同期処理の扱いと、オプション設定の方法に注目しましょう。
fast-xml-parser は、クラスベースの API を採用しており、インスタンス化後に解析を実行します。設定はコンストラクタで渡します。
// fast-xml-parser: クラスベースの解析
import { XMLParser } from "fast-xml-parser";
const parser = new XMLParser({ ignoreAttributes: false });
const result = parser.parse(xmlString);
// 同期的に処理され、結果がオブジェクトで返る
xml-js は、関数ベースのシンプルな API を提供します。オプションをオブジェクトで渡す形式です。
// xml-js: 関数ベースの解析
import { xml2js } from 'xml-js';
const result = xml2js(xmlString, { compact: false, spaces: 4 });
// 同期的に処理され、変換されたオブジェクトを返す
xml2js は、伝統的にコールバックベースでしたが、現在は Promise をサポートしています。parseStringPromise を使うのが現代的な使い方です。
// xml2js: Promise ベースの解析
import { parseStringPromise } from 'xml2js';
const result = await parseStringPromise(xmlString, { explicitArray: false });
// 非同期処理として待機が必要
逆に、JavaScript オブジェクトを XML 文字列に戻す際も、各ライブラリでアプローチが異なります。特に属性(attributes)とテキストノードの扱いが重要です。
fast-xml-parser は XMLBuilder クラスを使用します。フォーマット設定が細かく制御できます。
// fast-xml-parser: ビルダー使用
import { XMLBuilder } from "fast-xml-parser";
const builder = new XMLBuilder({ format: true, ignoreAttributes: false });
const xmlOutput = builder.build(jsonObject);
// 整形された XML 文字列が生成される
xml-js は js2xml 関数を使用します。コンパクトモードかどうかで出力形式が変わります。
// xml-js: 構築関数使用
import { js2xml } from 'xml-js';
const xmlOutput = js2xml(jsonObject, { compact: false, spaces: 2 });
// 指定したスペース数で整形される
xml2js は Builder クラスを使用します。ルートノードの名前などを指定可能です。
// xml2js: Builder クラス使用
import { Builder } from 'xml2js';
const builder = new Builder({ headless: false });
const xmlOutput = builder.buildObject(jsonObject);
// XML 宣言を含む出力が可能
XML 処理において最も重要なのがセキュリティです。特に XXE(XML External Entity)攻撃への対策は必須です。
fast-xml-parser は、セキュリティ機能を強く意識して設計されています。デフォルトまたはオプションで外部エンティティの読み込みを防止できます。
// fast-xml-parser: セキュリティオプション
const parser = new XMLParser({
ignoreAttributes: false,
allowBooleanAttributes: true
// 外部エンティティの処理はデフォルトで制限される傾向がある
});
xml-js は、基本的な変換に焦点を当てており、セキュリティ機能は最小限です。入力データの信頼性が低い場合、追加の対策が必要です。
// xml-js: 基本的な変換のみ
const result = xml2js(xmlString, { compact: true });
// 外部エンティティ対策は開発者側で管理する必要がある
xml2js は、設定により外部エンティティを無効化できますが、明示的な設定が必要です。セキュリティパッチは定期的に提供されています。
// xml2js: 外部エンティティの無効化
const parser = new Parser({
explicitCharkey: true,
// 外部参照を許可しない設定などが必要
});
XML の属性(attr)とテキストコンテンツをどう区別するかは、ライブラリによって出力構造が大きく異なります。
fast-xml-parser は、属性を特定のキー(デフォルトでは @_ など)に格納する設定が可能です。
// fast-xml-parser: 属性の扱い
const parser = new XMLParser({
ignoreAttributes: false,
attributeNamePrefix: "@_"
});
// 属性は @_id のようにアクセス可能
xml-js は、compact モードかどうかで構造が変わります。compact: false の場合、要素タイプで区別されます。
// xml-js: 要素タイプの区別
const result = xml2js(xmlString, { compact: false });
// { type: 'element', name: 'tag', attributes: {...} } のような構造
xml2js は、属性を $ キー、テキストを _ キーに格納するのがデフォルトの挙動です。
// xml2js: 属性とテキストのキー
// 出力例: { tag: { $: { id: "1" }, _: "content" } }
// $ が属性、_ がテキストコンテンツを表す
数千行に及ぶサイトマップ XML を処理し、URL リストを抽出する場合。
fast-xml-parser// fast-xml-parser for large files
const parser = new XMLParser();
const result = parser.parse(largeSitemapXml);
небольшого 設定ファイルを読み込むだけで、複雑な変換は不要な場合。
xml-js// xml-js for simple config
const config = xml2js(configXml, { compact: true });
既存のシステムで xml2js がすでに使われており、挙動の互換性を保ちたい場合。
xml2js// xml2js for legacy compatibility
const response = await parseStringPromise(soapResponse);
| 機能 | fast-xml-parser | xml-js | xml2js |
|---|---|---|---|
| 解析速度 | 🚀 非常に高速 | ⚡ 高速 | 🐢 標準 |
| API スタイル | クラスベース | 関数ベース | クラス/関数混在 |
| 非同期処理 | 同期が基本 | 同期が基本 | Promise サポート |
| セキュリティ | 🛡️ 強力な保護機能 | ⚠️ 基本機能のみ | ⚠️ 設定で対策可能 |
| 出力制御 | 細かく制御可能 | シンプル | 詳細な設定可能 |
| コミュニティ | 活発に成長中 | 安定 | 非常に大きい |
プロジェクトの要件に応じて、以下の基準で選定してください。
fast-xml-parser は、現代のウェブ開発において最もバランスの取れた選択肢です 🧰。速度、セキュリティ、機能性のすべてにおいて優れており、新規プロジェクトではまずこれを検討すべきです。特にパフォーマンスが重要な場面や、信頼性の低い外部データを扱う場合に真価を発揮します。
xml-js は、軽量さとシンプルさを求める場合に適しています 🔧。バンドルサイズを気にする場合や、変換ロジックが単純な場合に有効です。ただし、高度なセキュリティ機能や複雑な変換ルールが必要な場合は物足りない可能性があります。
xml2js は、安定性と互換性を最優先する場合に選択します 🏛️。長年の実績があり、コミュニティのサポートも厚いため、既存システムとの連携や、変更リスクを最小限に抑えたいエンタープライズ環境で役立ちます。
結論: 新規プロジェクトでは fast-xml-parser を第一候補とし、特定の制約がある場合に他を検討するのが賢明です。どちらを選ぶにしても、外部からの XML 入力を扱う際は、必ずセキュリティ設定を確認してください。
パフォーマンスとセキュリティを最優先する場合は fast-xml-parser を選定してください。このライブラリは変換速度が非常に速く、XXE 攻撃などのセキュリティリスクに対する保護機能も充実しています。大規模な XML データを処理する必要がある場合や、セキュリティ要件が厳しいプロジェクトに適しています。
シンプルで軽量な変換機能のみが必要な場合は xml-js が適しています。API が直感的で、設定オプションも少なめであるため、学習コストが低く、すぐに導入できます。複雑な変換ルールが必要ない場合や、バンドルサイズをできるだけ小さく抑えたい場合に有効です。
既存のプロジェクトとの互換性や、長年の実績による安定性を重視する場合は xml2js を選択してください。非常に長い歴史があり、コミュニティでの利用事例が豊富ため、トラブルシューティングの情報も見つけやすいです。レガシーシステムとの連携や、安定性が最優先されるエンタープライズ環境に向いています。
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]
