繁体   English   中英

解析Node.js中的XML文件

[英]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-streamxml2json 我决定使用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, '&amp;'), 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>

引用并感谢@tim

我认为您的问题是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM