在 JavaScript (Node.js) 中处理 XML:库、解析与创建
XML(可扩展标记语言)在企业系统、配置文件以及遗留 API 的数据交换中仍然是一种常用的格式。在 Node.js 生态系统中,有多个成熟的库可以高效地解析、创建和转换 XML 文档。本文将介绍三个最流行的库:fast-xml-parser、xml2js 和 libxmljs,并展示它们的使用示例。
1. fast-xml-parser — 快速且安全的解析器
fast-xml-parser 是 Node.js 中性能最高的 XML 处理库之一。它支持同步和异步解析,并且能够根据 XSD 模式验证 XML 文档。
安装
npm install fast-xml-parser将 XML 解析为 JavaScript 对象的示例
const { XMLParser } = require('fast-xml-parser');
const xmlData = `<?xml version="1.0" encoding="UTF-8"?><bookstore> <book category="programming"> <title lang="en">JavaScript: The Good Parts</title> <author>Douglas Crockford</author> <year>2008</year> <price>29.99</price> </book></bookstore>`;
const parser = new XMLParser({ ignoreAttributes: false, attributeNamePrefix: '@_'});
const result = parser.parse(xmlData);console.log(JSON.stringify(result, null, 2));设置 ignoreAttributes: false 可以保留 XML 标签的属性,而 attributeNamePrefix 则为属性名添加前缀,以避免与普通标签名冲突。
从对象创建 XML
const { XMLBuilder } = require('fast-xml-parser');
const builder = new XMLBuilder({ format: true, ignoreAttributes: false});
const obj = { bookstore: { book: { '@_category': 'programming', title: { '@_lang': 'en', '#text': 'Clean Code' }, author: 'Robert C. Martin', year: 2008, price: 39.99 } }};
const xmlOutput = builder.build(obj);console.log(xmlOutput);2. xml2js — 简单可靠的转换器
xml2js 是一个经典的库,用于将 XML 转换为 JSON 以及反向转换。它提供了简单的 API,并且文档齐全。
安装
npm install xml2js带错误处理的 XML 解析
const xml2js = require('xml2js');const fs = require('fs');
const parser = new xml2js.Parser({ explicitArray: false, // 不将单个元素包装成数组 trim: true, normalizeTags: true // 标准化标签的大小写});
fs.readFile('config.xml', 'utf-8', (err, data) => { if (err) { console.error('读取文件错误:', err); return; } parser.parseString(data, (parseErr, result) => { if (parseErr) { console.error('XML 解析错误:', parseErr); return; } console.log('配置参数:', result.configuration); });});使用 xml2js 创建 XML
const xml2js = require('xml2js');
const builder = new xml2js.Builder({ xmldec: { version: '1.0', encoding: 'UTF-8' }, renderOpts: { pretty: true, indent: ' ' }});
const obj = { response: { status: 'success', data: { user: { id: 123, name: '伊万·彼得罗夫', email: 'ivan@example.com' } } }};
const xml = builder.buildObject(obj);console.log(xml);3. libxmljs — 用于高级 XML 处理
l