Node.js解析XML遇Non-whitespace before first tag错误,已处理BOM仍未解决
问题排查与修复
解析错误(Non-whitespace before first tag)的修复
你当前的BOM去除方式存在潜在偏差,字符串替换可能因编码转换问题导致BOM未被彻底移除,建议改用更可靠的二进制层面处理:
const xml2js = require('xml2js'); const fs = require('fs'); const parseString = require('xml2js').parseString; fs.readFile('data.xml', function(err, data){ if (err) throw err; // 从Buffer层面移除UTF-8 BOM(二进制标识为EF BB BF) if (data.length >= 3 && data[0] === 0xEF && data[1] === 0xBB && data[2] === 0xBF) { data = data.slice(3); } const dataWithoutBOM = data.toString('utf8'); parseString(dataWithoutBOM, function(err, result){ // ...后续解析代码 }); });
如果偏好字符串层面处理,也可以优化替换逻辑,只匹配开头的BOM(避免误替换中间可能出现的相同字符):
const dataWithoutBOM = data.toString('utf8').replace(/^\uFEFF/, '');
代码中的运行时错误
即使XML解析成功,你的代码也会因变量未定义报错:遍历partnerList时,未将partnerList[j]赋值给partner变量,需补充这行代码:
for (let j = 0; j < partnerList.length; j++) { const partner = partnerList[j]; // 新增此行 partnerlist.push({ name: partner.$.aname, zipcode: partner.$.zipcode, city: partner.$.city, street: partner.$.street } ); }
额外优化建议
外层循环for (let i = 0; i < 1; i++)仅执行一次,若你确认result.Trans数组只有一个元素,可直接用const iD = docguID[0];代替循环,代码更简洁。
内容的提问来源于stack exchange,提问作者Nechi
相关产品推荐
相关产品推荐

