我想在Nodejs中解析XML数据,但总是出现错误: 第一个标签之前不能有空格。
这个错误的原因是,我要解析的文件是UTF-8编码的,并且有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;
const dataWithoutBOM = data.toString().replace(/\uFEFF/g, '');
parseString(dataWithoutBOM, function(err, result){
if (err) throw err;
const docguID = result.Trans;
let docguid;
let partnerlist=[];
for (let i = 0; i < 1; i++) {
const iD = docguID[i];
docguid= iD.$.DocGUID;
const partnerList = iD.Partner;
for (let j = 0; j < partnerList.length; j++) {
partnerlist.push({
name: partner.$.aname,
zipcode: partner.$.zipcode,
city: partner.$.city,
street: partner.$.street
}
);
}
}
console.log(docguid, partnerlist);
});
});
我不知道为什么会出现这个错误,因为我正在用空字符串替换 BOM。有谁知道问题出在哪里吗?
我认为这就是所谓的字节顺序标记(BOM)的问题,它是一个 3 字节的“零宽度无中断空格”Unicode 字符,Windows 系统自动将其添加到 UTF-8 文件中。使用十六进制编辑器检查文件时,BOM 显示为十六进制 EFBBBF。
解决这个问题: 请看这个,
https://www.apimock.com/blog/20121127_xml2js-sax-js-non-whitespace-before-first-tag
我刚刚保存了新文件并且它有效。我还是不知道我做错了什么。
它对我有用。
在将字符串解析为 xml 之前,我删除了所有超出 ASCII 表范围的字符。
removeNonAsciiChars = (value: string): string => {
let sanitizedString = '';
let errorCharacters = '';
for (let i = 0; i < value.length; i++) {
let code = value.charCodeAt(i);
//interval ASCII (0-127)
if (code > 127) {
errorCharacters += value[i];
} else {
sanitizedString += value[i]
}
}
if (errorCharacters) {
console.log(`The characters: ${errorCharacters} is out of range ASCII and have been removed`);
}
return sanitizedString;
}
xml2js.parseString(removeNonAsciiChars(yourStringToParseXml))