fast-xml-parser vs libxmljs vs xml2js vs xmlbuilder vs xmlbuilder2
Node.js における XML 処理ライブラリの選定と実装比較
fast-xml-parserlibxmljsxml2jsxmlbuilderxmlbuilder2類似パッケージ:

Node.js における XML 処理ライブラリの選定と実装比較

fast-xml-parserlibxmljsxml2jsxmlbuilderxmlbuilder2 は、JavaScript 環境で XML データの解析(パース)や生成(ビルド)を行うための主要なライブラリです。xml2jsfast-xml-parser は XML を JavaScript オブジェクトに変換する解析に特化しており、xmlbuilder シリーズは XML 構造を構築することに重点を置いています。libxmljs は C 言語のライブラリをラップしており高速ですが、ネイティブコンパイルが必要です。プロジェクトの環境(ブラウザ、Node.js、サーバーレス)と、速度や機能の要件に応じて適切なツールを選択する必要があります。

npmのダウンロードトレンド

3 年

GitHub Starsランキング

統計詳細

パッケージ
ダウンロード数
Stars
サイズ
Issues
公開日時
ライセンス
fast-xml-parser70,924,3723,062856 kB665日前MIT
libxmljs01,06217.7 MB692年前MIT
xml2js04,9713.44 MB2493年前MIT
xmlbuilder0927-76年前MIT
xmlbuilder20411940 kB264ヶ月前MIT

Node.js における XML 処理ライブラリの選定と実装比較

JavaScript で XML を扱う場合、目的が「解析(Parsing)」なのか「生成(Building)」なのか、そして実行環境が「ブラウザ」なのか「Node.js」なのかによって、選ぶべきライブラリが明確に分かれます。fast-xml-parserlibxmljsxml2jsxmlbuilderxmlbuilder2 はそれぞれ異なるアプローチを取っており、一長一短があります。本稿では、実務で直面する技術的なトレードオフに焦点を当て、各ライブラリの特性を比較します。

🚀 解析エンジン:純粋な JS vs ネイティブバインディング

XML 解析の速度と環境依存性は、ライブラリ選びの最大の分岐点です。

fast-xml-parser は、純粋な JavaScript(TypeScript)で実装されています。

  • 外部のネイティブライブラリに依存しないため、インストールが簡単です。
  • Webpack や Vite でのバンドルも容易で、ブラウザ環境でもそのまま動作します。
  • 解析速度が非常に速く、バリデーション機能もオプションで利用可能です。
// 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 のラッパーです。

  • 解析速度は圧倒的に高速で、巨大な XML ファイルを扱う場合に有利です。
  • XPath クエリや XML スキーマ検証など、高機能な操作が可能です。
  • 一方で、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 に比べると解析速度は劣りますが、機能は十分です。
  • 非同期 API(Promise/Callback)を提供しており、大きなファイルのストリーム処理にも対応しています。
// 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 生成:レガシー vs モダンなチェーン操作

XML を構築する際、コードの可読性とメンテナンス性は重要です。

xmlbuilder は、長らく標準として使われてきましたが、現在はメンテナンスモードに入っています。

  • 単純なチェーン操作で XML を生成できます。
  • 新規プロジェクトでは使用を避け、後継の 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 の問題点を解消するために書き直されたモダンなライブラリです。

  • ES6 モジュールに対応し、より直感的な API 設計になっています。
  • XML 生成だけでなく、オブジェクトからの変換(convert)機能も強化されています。
  • 型安全性(TypeScript)のサポートも改善されています。
// 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 は、解析と同時にバリデーションを行うオプションを提供します。

  • 設定一つで、無効な XML 構造を検出できます。
  • XXE(XML External Entity)攻撃などのセキュリティリスクに対する対策オプションも用意されています。
// 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)による厳密な検証が可能です。

  • 業務システムなど、データ形式の厳格な管理が必要な場合に強力です。
  • 純粋な JS ライブラリでは実現困難なレベルの検証を行えます。
// 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 は古い設計のため、モダンなビルドツールとの相性で警告が出ることがあります。

📊 実装パターンの違い:同期 vs 非同期

処理のフロー設計にも影響します。

  • 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)libxmljsXSD 検証機能が強力。

🏁 結論:現代的な選択とは

fast-xml-parser は、純粋な JavaScript で動作しながらも libxmljs に匹敵する速度を出せるため、多くのケースで最適な選択となります。特に、コンパイルの手間を避けたい、あるいはブラウザでも動かしたい場合には、これ一択と言えるでしょう。

libxmljs は、サーバーサイドで巨大な XML を処理し、かつ XSD 検証などの高度な機能が必要な場合にのみ検討します。導入コスト(ビルド環境)に見合うメリットがある場面は限られています。

xmlbuilder2 は、XML 生成が必要な場合の現代的な標準です。古い xmlbuilder を使っているプロジェクトは、技術的負債を減らすために移行を検討する価値があります。

xml2js は、まだ現役で使われていますが、新規プロジェクトでは fast-xml-parser の方がパフォーマンスと機能面で優れていることが多いです。

XML 処理は地味なタスクに見えますが、ライブラリの選択がセキュリティやパフォーマンスに直結します。プロジェクトの環境と要件に合わせて、適切なツールを選びましょう。

選び方: fast-xml-parser vs libxmljs vs xml2js vs xmlbuilder vs xmlbuilder2

  • fast-xml-parser:

    純粋な JavaScript で書かれており、コンパイル不要で動作するため、ブラウザやサーバーレス環境でも問題なく動作します。解析速度が非常に速く、バリデーション機能も内蔵しているため、高性能かつセキュリティを重視する現代的なプロジェクトに最適です。

  • libxmljs:

    C 言語の libxml2 をラップしているため、解析・変換速度が最も高速です。ただし、ネイティブモジュールのコンパイル(node-gyp)が必要となるため、ビルド環境が整っている Node.js サーバー向けです。ブラウザやコンパイル環境のないデプロイ先には向きません。

  • xml2js:

    長年実績のある定番ライブラリで、コミュニティによるサポートが厚いです。API が安定しており、既存プロジェクトの保守や、特別な高速性が求められない一般的な Node.js アプリケーションでの利用に適しています。

  • xmlbuilder:

    XML 生成に特化した古いライブラリです。現在は xmlbuilder2 への移行が推奨されており、新規プロジェクトでの採用は避けるべきです。既存のレガシーコードの保守時にのみ検討します。

  • xmlbuilder2:

    xmlbuilder の後継として設計されたモダンなライブラリです。XML 生成だけでなく変換機能も強化されており、チェーン操作による直感的な記述が可能です。新規で XML 構築機能が必要な場合に選択すべきパッケージです。

fast-xml-parser のREADME

fast-xml-parser

NPM total downloads

Validate XML, Parse XML to JS Object, or Build XML from JS Object without C/C++ based libraries and no callback.

FXP logo
  • Validate XML data syntactically. Use detailed-xml-validator to verify business rules.
  • Parse XML to JS Objects and vice versa
  • Common JS, ESM, and browser compatible
  • Faster than any other pure JS implementation.

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


Your Support, Our Motivation

Try out our New Thoughts

  • WishIn - You need it if negative thoughts take over all the time
  • Flowgger: 90% less logs size and 90% less debugging time
    Flowgger Logging Framework
  • Text2Chart: interactive flow chart out of simple text.

Financial Support

Sponsor this project

donate button


fxp_sponsors

This is a donation. No goods or services are expected in return. Any requests for refunds for those purposes will be rejected.

Users

more

The list of users are mostly published by Github or communicated directly. Feel free to contact if you find any information wrong.


More about this library

How to use

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 NameSize
fxbuilder.min.js6.5K
fxparser.min.js20K
fxp.min.js26K
fxvalidator.min.js5.7K

Documents

v3v4 and v5v6
documents
  1. Getting Started
  2. XML Parser
  3. XML Builder
  4. XML Validator
  5. Entities
  6. HTML Document Parsing
  7. PI Tag processing
  8. Path Expression
  1. Getting Started
  2. Features
  3. Options
  4. Output Builders
  5. Value Parsers

note:

  • Version 6 is released with version 4 for experimental use. Based on its demand, it'll be developed and the features can be different in final release.
  • Version 5 has the same functionalities as version 4.

Performance

negative means error

XML Parser

  • Y-axis: requests per second
  • X-axis: File size

XML Builder

* Y-axis: requests per second

Usage Trend

Usage Trend of fast-xml-parser

NPM Usage Trend of fast-xml-parser

Supporters

Contributors

This project exists thanks to all the people who contribute. [Contribute].

Backers from Open collective

Thank you to all our backers! 🙏 [Become a backer]

License

  • MIT License

Donate $5