xml2js.parseString() 返回 undefined 是因它是异步 API,必须传回调函数;同步解析应使用 parseStringPromise() 或 Parser 实例配合 Promise 封装。
xml2js.parseString() 解析 XML 字符串时为什么返回 undefined?
常见原因是没传回调函数,xml2js.parseString() 是异步 API,不支持直接 return。同步解析要用 xml2js.parseStringPromise()(v0.5+)或改用 new xml2js.Parser().parseString() 配合 Promise 封装。
- 错误写法:
const result = xml2js.parseString(xml); // result 是 undefined
- 正确写法(推荐 Promise 版):
xml2js.parseStringPromise(xml) .then(obj => console.log(obj)) .catch(err => console.error(err));
- 若需同步行为(仅限可信、小体积 XML),可用
DOMParser+ 自定义转换,但xml2js本身无真正同步解析入口
如何控制 parseString 的输出结构(比如去掉 $、_ 等属性)?
xml2js 默认把 XML 属性存为 $,文本内容存为 _,容易干扰后续处理。通过 options 关键参数可简化结构:
-
attrkey: '_'→ 把属性统一挂到_下(默认是$) -
charkey: '#'→ 把文本内容挂到#下(默认是_) -
ignoreAttrs: true→ 完全忽略属性(最常用) -
explicitArray: false→ 单个子元素不包装成数组(避免[{…}]) - 示例:
const parser = new xml2js.Parser({ ignoreAttrs: true, explicitArray: false, trim: true }); parser.parseString(xml, (err, result) => { /* result 中无 $ 和 _ */ });
xml2js.Builder() 生成 XML 时中文乱码或缺少 XML 声明?
默认生成的 XML 是 UTF-8 编码字符串,但不带 声明,且若原始 JS 对象含非 ASCII 字符,需确保运行环境支持 UTF-8 输出(如 Node.js 终端、文件写入时指定编码)。