在 JavaScript (Node.js) 中处理 XML:库与工具

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Node.js 环境中的 XML 处理简介

XML(可扩展标记语言)仍然是存储和传输结构化数据的热门格式,尤其在企业系统、SOAP 服务、配置文件和集成解决方案中。在 Node.js 生态系统中,有多个成熟的库可以高效地解析、创建和修改 XML 文档。在本文中,我们将介绍三种主要工具:xml2js(用于在 XML 和 JSON 之间转换)、fast-xml-parser(高性能解析器)和 xmldom(Node.js 的 DOM Level 2 实现)。



1. xml2js 库:简单与通用

xml2js 是 Node.js 中最流行的 XML 处理库之一。其主要任务是将 XML 转换为 JavaScript 对象(JSON),反之亦然。当您需要快速将 XML 数据集成到现代 JavaScript 应用程序中时,这是一个理想的选择。



安装

npm install xml2js


示例:将 XML 解析为 JSON

const xml2js = require('xml2js');const parser = new xml2js.Parser({ explicitArray: false });

const xmlData = `<bookstore> <book category="programming"> <title lang="en">Learning Node.js</title> <author>John Doe</author> <price>29.99</price> </book></bookstore>`;

parser.parseString(xmlData, (err, result) => { if (err) { console.error('解析错误:', err); return; } console.log(JSON.stringify(result, null, 2)); // 输出: { bookstore: { book: { category: "programming", title: "Learning Node.js", author: "John Doe", price: "29.99" } } }});


示例:从 JSON 创建 XML

const xml2js = require('xml2js');const builder = new xml2js.Builder({ headless: true });

const jsonObj = { root: { $: { xmlns: "http://example.com/ns" }, item: [ { $: { id: "1" }, _: "第一个元素" }, { $: { id: "2" }, _: "第二个元素" } ] }};

const xml = builder.buildObject(jsonObj);console.log(xml);/* 输出:<root xmlns="http://example.com/ns"> <item id="1">第一个元素</item> <item id="2">第二个元素</item></root>*/


主要功能:

  • 自动转换属性(前缀 $)和文本内容(前缀 _)
  • 解析器配置:explicitArray、explicitRoot、attrkey、charkey
  • 支持命名空间
  • 通过流处理大文件(流式解析)


2. fast-xml-parser:性能与灵活性

如果您需要最大的解析速度(例如,处理数千个 XML 文件或实时应用程序),请关注 fast-xml-parser。这个解析器是用纯 JavaScript 编写的,但针对高性能进行了优化。



安装

npm install fast-xml-parser


示例:带验证的快速解析

const { XMLParser, XMLBuilder, XMLValidator } = require('fast-xml-parser');

const xmlData = `<config> <database host="localhost" port="5432"> <user>admin</user> <password>secret</password> </database></config>`;

// 验证有效性const validationResult = XMLValidator.validate(xmlData);if (validationResult !== true) { console.error('XML 无效:', validationResult.err); process.exit(1);}

// 解析const parser = new XMLParser({ ignoreAttributes: false, attributeNamePrefix: "@_"});const jsonObj = parser.parse(xmlData);console.log(jsonObj.config.database["@_host"]); // localhostconsole.log(jsonObj.config.datab

推荐