Node.js怎么解析XML xml2js库使用教程

5次阅读

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

Node.js怎么解析XML xml2js库使用教程

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:namename

配置示例:

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)。

text=ZqhQzanResources