fast-xml-parser vs xml-js vs xml2js
JavaScript 生态中的 XML 解析与生成方案对比
fast-xml-parserxml-jsxml2js类似的npm包:

JavaScript 生态中的 XML 解析与生成方案对比

fast-xml-parser、xml-js 和 xml2js 是 Node.js 生态中处理 XML 数据的三个核心库。它们都致力于实现 XML 与 JavaScript 对象之间的高效转换,但在解析性能、API 设计风格、数据结构映射规则以及验证能力上存在显著差异。fast-xml-parser 以高性能和内置验证著称;xml2js 是历史最悠久的老牌库,生态稳定但性能一般;xml-js 则提供了轻量级的函数式转换方案,常用于构建工具链。

npm下载趋势

3 年

GitHub Stars 排名

统计详情

npm包名称
下载量
Stars
大小
Issues
发布时间
License
fast-xml-parser03,1391.31 MB231 个月前MIT
xml-js01,339-1278 年前MIT
xml2js04,9593.44 MB2503 年前MIT

JavaScript 生态中的 XML 解析与生成方案对比

在现代 Web 开发中,虽然 JSON 已成为数据交换的主流格式,但 XML 依然在特定领域占据重要地位,如 SOAP 接口、RSS 订阅、Sitemap 协议以及部分企业级遗留系统。fast-xml-parser、xml-js 和 xml2js 是 Node.js 生态中处理 XML 的三个主要库。它们都旨在简化 XML 与 JavaScript 对象之间的转换,但在设计理念、性能表现和 API 风格上存在显著差异。

🚀 解析 API 与使用风格

fast-xml-parser 采用现代类实例化风格,支持同步解析,性能极佳。

  • 需要实例化 XMLParser 类。
  • 默认配置通常能满足大部分需求,支持高度定制。
// fast-xml-parser: 类实例化同步解析
import { XMLParser } from "fast-xml-parser";
const parser = new XMLParser();
const result = parser.parse(xmlString);

xml2js 是老牌库,早期基于回调,现在支持 Promise。

  • 提供 parseString (回调) 和 parseStringPromise (Promise)。
  • 配置通过构造函数传入。
// xml2js: 支持 Promise 的解析
import { parseStringPromise } from "xml2js";
const result = await parseStringPromise(xmlString);

xml-js 提供简单的函数式调用,配置灵活。

  • 直接调用 xml2js 函数。
  • 支持 compact 模式(紧凑)和默认模式(详细)。
// xml-js: 函数式调用
import { xml2js } from "xml-js";
const result = xml2js(xmlString, { compact: false });

🗂️ 数据结构映射:属性与文本处理

这是三个库差异最大的地方,直接影响后续代码如何处理数据。

fast-xml-parser 默认将属性前缀化为 @_,文本内容直接作为值。

  • 可以通过 ignoreAttributes: false 保留属性。
  • 结构清晰,易于访问。
// fast-xml-parser: 属性带前缀
// <book id="1">Title</book>
// 输出:{ book: { "@_id": "1", "#text": "Title" } } (取决于配置)
const parser = new XMLParser({ ignoreAttributes: false });

xml2js 默认将属性放在 $ 键下,文本内容放在 _ 键下。

  • 这种嵌套结构有时显得冗长。
  • 需要频繁访问 .$ 和 ._。
// xml2js: 属性在 $ 中
// <book id="1">Title</book>
// 输出:{ book: { $: { id: "1" }, _: "Title" } }
const result = await parseStringPromise(xmlString);

xml-js 默认将属性放在 _attributes 键,文本放在 _text 键(非紧凑模式)。

  • 语义化较好,但键名较长。
  • 紧凑模式下结构完全不同。
// xml-js: 属性在 _attributes 中
// <book id="1">Title</book>
// 输出:{ elements: [{ attributes: { id: "1" }, text: "Title" }] }
const result = xml2js(xmlString, { compact: false });

🛡️ 验证能力

fast-xml-parser 内置了独立的验证器 XMLValidator。

  • 可以在解析前快速检查 XML 合法性。
  • 适合处理不可信的外部输入。
// fast-xml-parser: 内置验证
import { XMLValidator } from "fast-xml-parser";
const validation = XMLValidator.validate(xmlString);
if (validation !== true) console.error(validation.err);

xml2js 没有内置验证器。

  • 解析失败会直接抛出错误或返回错误回调。
  • 依赖 try-catch 处理非法 XML。
// xml2js: 依赖异常捕获
try {
  await parseStringPromise(xmlString);
} catch (err) {
  console.error("Invalid XML", err);
}

xml-js 没有内置验证器。

  • 同样依赖异常捕获或检查返回结果。
  • 适合信任源数据的场景。
// xml-js: 依赖异常捕获
try {
  xml2js(xmlString);
} catch (err) {
  console.error("Invalid XML", err);
}

🏗️ 生成 XML (JSON to XML)

fast-xml-parser 使用 XMLBuilder 类。

  • 配置与解析器类似,保持一致性。
  • 性能优秀。
// fast-xml-parser: 构建器
import { XMLBuilder } from "fast-xml-parser";
const builder = new XMLBuilder();
const xmlContent = builder.build(jsonObject);

xml2js 使用 Builder 类。

  • 需要单独导入。
  • 配置项较多,学习成本稍高。
// xml2js: 构建器
import { Builder } from "xml2js";
const builder = new Builder();
const xmlContent = builder.buildObject(jsonObject);

xml-js 使用 js2xml 函数。

  • 与解析函数对称,简单易用。
  • 支持紧凑模式输出。
// xml-js: 函数式构建
import { js2xml } from "xml-js";
const xmlContent = js2xml(jsonObject, { compact: false });

📊 核心差异总结

特性fast-xml-parserxml2jsxml-js
API 风格类实例化 (同步)函数/类 (Promise/回调)函数式
性能⭐⭐⭐⭐⭐ (极快)⭐⭐⭐ (一般)⭐⭐⭐⭐ (较快)
验证支持✅ 内置独立验证器❌ 依赖解析异常❌ 依赖解析异常
属性映射可配置前缀 (如 @_)固定 $ 和 _可配置 (如 _attributes)
维护状态🟢 活跃🟡 稳定/低频更新🟡 稳定
适用场景高性能、新项目、需验证遗留系统、稳定优先简单转换、构建工具

💡 架构师建议

fast-xml-parser 是目前综合表现最好的选择。它的解析速度最快,且内置验证功能对于处理外部输入至关重要。如果你的项目对性能敏感,或者需要处理不可信的 XML 数据,这是首选。

xml2js 适合维护旧项目。许多现有的 Node.js 项目依赖它,其 API 非常稳定。如果没有性能瓶颈,且团队已经熟悉其 $ 和 _ 的数据结构,继续使用它可以减少迁移成本。

xml-js 适合轻量级场景。它在一些构建工具链(如 Cordova 插件配置)中常见。如果你需要简单的 XML 转换且不希望引入较重的依赖,它是一个不错的中间选项。

最终建议:在新项目中,优先选择 fast-xml-parser。它不仅性能优越,而且 API 设计更符合现代 JavaScript 开发习惯,内置的验证功能也能减少潜在的安全风险。

如何选择: fast-xml-parser vs xml-js vs xml2js

  • fast-xml-parser:

    选择 fast-xml-parser 如果你的项目对性能敏感,或者需要处理不可信的外部 XML 输入。它提供了内置的验证器,能在解析前快速检查 XML 合法性,且 API 设计现代,支持同步解析,适合新架构开发。

  • xml-js:

    选择 xml-js 如果你需要轻量级的转换工具,或者正在维护依赖它的构建工具链(如某些 Cordova 插件)。它的函数式 API 简单易用,支持紧凑模式,适合不需要复杂配置的场景。

  • xml2js:

    选择 xml2js 如果你正在维护遗留系统,或者团队已经熟悉其特定的数据结构(如 $ 和 _ 键)。它的 API 非常稳定,社区资源丰富,适合不需要极致性能但追求稳定性的企业级项目。

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

IMPORTANT: It is recommended to use fast-xml-validator instead of inbuilt validator.

Before using this library

  • Flexible-XML-Parser is 1.25 times faster than this library when not preserving order of tags. Takes less memory when processing big files. Supports incomplete XML/HTML. And output is highly customizable. Build whatever you want. So if you're fine with some extra configuration then try it out.
  • @nodable/sax is a SAX parser based on Flexible-XML-Parser. 3-4 times faster than sax and support all features of base package like incomplete input, streams, skipping certain tags from processing etc.
  • fast-xml-validator is separated from this package. Has many features. Faster. You can exvlude particular tag from validation. And much more.
  • fast-xml-builder is a XML to JS Object builder used in this package in past. Now, it supports more features, and faster. So, recommend to use it directly.

Your Support, Our Motivation

Please join Discord community for pre release announcements and discussions.

Financial Support

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.

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

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