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