xml2js是node.js解析xml最常用、最轻量的方案,可将xml字符串转为js对象或反向生成xml,支持配置项定制解析行为,适用于配置读取、api数据处理等场景。

Node.js 解析 XML 最常用、最轻量的方案就是 xml2js。它把 XML 字符串转成 JavaScript 对象(JSON-like structure),无需预定义 schema,上手快,适合大多数日常场景,比如读取配置文件、处理 API 返回的 XML 数据等。
安装 xml2js
在项目根目录运行:
- npm install xml2js
注意:xml2js 是纯 JavaScript 实现,无原生依赖,安装快,跨平台稳定。
基础解析:XML → JS 对象
最常见需求:把一段 XML 字符串转成可操作的对象。
- 用
parseString()(推荐)或parseStringPromise()(v0.5+ 支持 Promise) - 默认会把标签名转为小驼峰(如
<user-name></user-name>→userName),可通过tagNameProcessors关闭 - 文本内容默认放在
_$属性里,子标签放在同名属性数组中(即使只有一个)
示例:
const xml2js = require('xml2js');
const xml = `<root>
<user id="101">
<name>张三</name>
<age>28</age>
</user>
</root>`;
xml2js.parseString(xml, (err, result) => {
if (err) throw err;
console.log(result.root.user[0].name[0]._); // "张三"
console.log(result.root.user[0].$.id); // "101"
});
常用配置项(让解析更可控)
xml2js 默认行为对新手可能有点“反直觉”,加几个关键选项就能更贴近预期:
-
ignoreAttrs: false(默认 true)→ 保留属性,存到$对象里 -
mergeAttrs: true→ 把属性直接提升为同级字段(需配合ignoreAttrs: false) -
explicitArray: false(默认 true)→ 单个子元素不强制为数组,避免[{...}]套一层 -
normalize: true→ 自动 trim 文本前后空格 -
attrNameProcessors: [xml2js.processors.stripPrefix]→ 去掉命名空间前缀(如ns:name→name)
配置示例:
const parser = new xml2js.Parser({
ignoreAttrs: false,
explicitArray: false,
normalize: true
});
parser.parseString(xml, (err, result) => {
// result.root.user.name === "张三"
// result.root.user.id === "101"
});
反向操作:JS 对象 → XML(buildObject)
需要生成 XML 时,用 xml2js.Builder:
- 传入普通对象,自动转成格式良好的 XML 字符串
- 支持设置 root 节点名、是否缩进、是否带 XML 声明等
- 属性用
$键,文本内容用_键
示例:
const builder = new xml2js.Builder({
rootName: 'response',
renderOpts: { pretty: true }
});
const obj = {
response: {
$: { status: 'success' },
message: { _: '操作完成' },
data: { user: { name: '李四', age: 30 } }
}
};
const xml = builder.buildObject(obj);
// 输出带缩进的 XML 字符串
不复杂但容易忽略:解析大文件时建议用 xml2js.Parser 的流式接口(parseStringPromise + fs.createReadStream),避免内存爆掉;生产环境 XML 若含 DTD 或外部实体,记得禁用以防止 XXE 攻击(options.disableEntities = true)。










