fast-xml-parser、xml-js 和 xml2js 是 Node.js 生态中处理 XML 数据的三个核心库。它们都致力于实现 XML 与 JavaScript 对象之间的高效转换,但在解析性能、API 设计风格、数据结构映射规则以及验证能力上存在显著差异。fast-xml-parser 以高性能和内置验证著称;xml2js 是历史最悠久的老牌库,生态稳定但性能一般;xml-js 则提供了轻量级的函数式转换方案,常用于构建工具链。
在现代 Web 开发中,虽然 JSON 已成为数据交换的主流格式,但 XML 依然在特定领域占据重要地位,如 SOAP 接口、RSS 订阅、Sitemap 协议以及部分企业级遗留系统。fast-xml-parser、xml-js 和 xml2js 是 Node.js 生态中处理 XML 的三个主要库。它们都旨在简化 XML 与 JavaScript 对象之间的转换,但在设计理念、性能表现和 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。
// 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);
}
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-parser | xml2js | xml-js |
|---|---|---|---|
| API 风格 | 类实例化 (同步) | 函数/类 (Promise/回调) | 函数式 |
| 性能 | ⭐⭐⭐⭐⭐ (极快) | ⭐⭐⭐ (一般) | ⭐⭐⭐⭐ (较快) |
| 验证支持 | ✅ 内置独立验证器 | ❌ 依赖解析异常 | ❌ 依赖解析异常 |
| 属性映射 | 可配置前缀 (如 @_) | 固定 $ 和 _ | 可配置 (如 _attributes) |
| 维护状态 | 🟢 活跃 | 🟡 稳定/低频更新 | 🟡 稳定 |
| 适用场景 | 高性能、新项目、需验证 | 遗留系统、稳定优先 | 简单转换、构建工具 |
fast-xml-parser 是目前综合表现最好的选择。它的解析速度最快,且内置验证功能对于处理外部输入至关重要。如果你的项目对性能敏感,或者需要处理不可信的 XML 数据,这是首选。
xml2js 适合维护旧项目。许多现有的 Node.js 项目依赖它,其 API 非常稳定。如果没有性能瓶颈,且团队已经熟悉其 $ 和 _ 的数据结构,继续使用它可以减少迁移成本。
xml-js 适合轻量级场景。它在一些构建工具链(如 Cordova 插件配置)中常见。如果你需要简单的 XML 转换且不希望引入较重的依赖,它是一个不错的中间选项。
最终建议:在新项目中,优先选择 fast-xml-parser。它不仅性能优越,而且 API 设计更符合现代 JavaScript 开发习惯,内置的验证功能也能减少潜在的安全风险。
选择 fast-xml-parser 如果你的项目对性能敏感,或者需要处理不可信的外部 XML 输入。它提供了内置的验证器,能在解析前快速检查 XML 合法性,且 API 设计现代,支持同步解析,适合新架构开发。
选择 xml-js 如果你需要轻量级的转换工具,或者正在维护依赖它的构建工具链(如某些 Cordova 插件)。它的函数式 API 简单易用,支持紧凑模式,适合不需要复杂配置的场景。
选择 xml2js 如果你正在维护遗留系统,或者团队已经熟悉其特定的数据结构(如 $ 和 _ 键)。它的 API 非常稳定,社区资源丰富,适合不需要极致性能但追求稳定性的企业级项目。
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
IMPORTANT: It is recommended to use fast-xml-validator instead of inbuilt validator.
sax and support all features of base package like incomplete input, streams, skipping certain tags from processing etc.Please join Discord community for pre release announcements and discussions.
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]
