[英]Parsing XML file in Node.js
我正在使用带有KDE等离子的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
),并得到相同的结果。 我该如何正确使用它? 我正在使用此代码,但它始终返回undefined:
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包的方式应该没问题。 但是,你的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实体,解析器应该可以正常工作。
答案在工作示例链接下面
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));
});
});
在这种情况下,当我知道它应该工作正常时,我总是查看数据以及输入数据的任何可能问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.