使用多款XML解析器均失败,报错Unencoded <,求助问题原因与解决办法
问题原因与解决办法
为什么所有解析器都报错?
这是因为你的XML文件违反了XML标签命名的基本规则:XML元素的名称不能以数字开头。你里面的<2>、<3>这种标签完全不符合规范,任何合规的XML解析器都会直接报错拒绝处理,所以换多少个库结果都一样。
解决办法
分两种情况处理:
情况1:可以修改XML文件(推荐)
把数字开头的标签改成合法名称,比如:
<thing> <item id="2" value="300.0"/> <item id="3" value="1.0"/> </thing>
或者:
<thing> <num_2 value="300.0"/> <num_3 value="1.0"/> </thing>
修改后再用你原来的代码就能正常解析了。
情况2:无法修改XML文件
那只能先对XML文本做预处理,把非法标签替换成合法的,再交给解析器处理。比如在读取文件后加一段替换逻辑:
const fs = require("node:fs") const xml2js = require('xml2js') const parser = new xml2js.Parser() let data = fs.readFileSync('test.xml', "utf8") // 预处理:把<数字开头的标签替换成<num_数字 data = data.replace(/<(\d+)/g, '<num_$1') // 还要替换闭合标签(如果有的话) data = data.replace(/<\/(\d+)/g, '</num_$1') const json = await parser.parseStringPromise(data) console.log(JSON.stringify(json))
注意:这种预处理是临时方案,只适合简单的XML结构,如果XML里有复杂内容(比如CDATA里也有类似格式)可能会出错,优先推荐修改XML文件本身。
内容的提问来源于stack exchange,提问作者Voxelstice
相关产品推荐
相关产品推荐

