在 Node.js 中解析 XML 文件

问题描述 投票:0回答:3

我正在使用带有 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 文件(不带包)?

javascript node.js xml
3个回答
5
投票

此解决方案使用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, '&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


3
投票

我认为你的问题是 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));
     });

});

在这种情况下,当我知道它应该可以正常工作时,我总是会查看数据以及输入数据是否存在任何可能的问题。


1
投票

你使用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 实体,解析器应该可以正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.