我正在使用带有 KDE Plasma 的 Arch Linux 系统。我有大约 50mb 的 XML,我需要解析它。该文件具有自定义标签。
XML 示例:
<JMdict>
<entry>
<ent_seq>1000000</ent_seq>
<r_ele>
<reb>ヽ</reb>
</r_ele>
<sense>
<pos>&unc;</pos>
<gloss g_type="expl">repetition mark in katakana</gloss>
</sense>
</entry>
</JMdict>
我尝试了 Stack Overflow 上建议的许多解决方案,但它们根本不起作用,其中一些无法安装到我的系统中,例如
xml-stream
、xml2json
。我决定使用xml2js
(大多数人建议使用xml2js
),并得到了相同的结果。我怎样才能正确使用它?
我正在使用这段代码,但它总是返回未定义:
const fs = require('fs-extra');
const xml2js = require('xml2js');
const parser = new xml2js.Parser();
const path = "test.xml";
fs.readFile(path, {encoding: 'utf-8'}, function(error, data) {
parser.parseString(data, function(err, res) {
console.log(res);
});
});
Result: Undefined
有没有办法手动处理 XML 文件(不带包)?
此解决方案使用xml2js。
var fs = require('fs'),
slash = require('slash'),
xml2js = require('xml2js');
var parser = new xml2js.Parser();
let filename = slash(__dirname+'/foo.xml');
// console.log(filename);
fs.readFile(filename, "utf8", function(err, data) {
if(err) {
console.log('Err1111');
console.log(err);
} else {
//console.log(data);
// data.toString('ascii', 0, data.length)
parser.parseString(data.replace(/&(?!(?:apos|quot|[gl]t|amp);|#)/g, '&'), function (err, result) {
if(err) {
console.log('Err');
console.log(err);
} else {
console.log(JSON.stringify(result));
console.log('Done');
}
});
}
});
确切地说,您必须执行以下操作:
data.replace(/&(?!(?:apos|quot|[gl]t|amp);|#)/g, '&')
问题仅出现在标签下方&unc;
<pos>&unc;</pos>
我认为你的问题是 xml 数据中的未转义字符。
我可以使用这个来让你的示例正常工作:
xml数据:
<JMdict>
<entry>
<ent_seq>1000000</ent_seq>
<r_ele>
<reb>ヽ</reb>
</r_ele>
<sense>
<pos>YOUR PROBLEM WAS HERE</pos>
<gloss g_type="expl">repetition mark in katakana</gloss>
</sense>
</entry>
node.js 代码:
const fs = require('fs-extra');
const xml2js = require('xml2js');
const parser = new xml2js.Parser();
const path = "test.xml";
fs.readFile(path, {encoding: 'utf-8'}, function(error, data) {
parser.parseString(data, function(err, res) {
console.log(JSON.stringify(res.JMdict.entry, null, 4));
});
});
在这种情况下,当我知道它应该可以正常工作时,我总是会查看数据以及输入数据是否存在任何可能的问题。
你使用xml2js包的方式应该没问题。但是,您的 xml 格式有点不对。
如果您添加
console.log
以查看导致错误的原因
fs.readFile(path, {encoding: 'utf-8'}, function(error, data) {
parser.parseString(data, function(err, res) {
if (err) console.log(err);
console.log(res);
});
});
您会发现是
<pos>&unc;</pos>
行导致了问题。
如果修复 HTML 实体,解析器应该可以正常工作。