【问题标题】:Parsing XML file in Node.js在 Node.js 中解析 XML 文件
【发布时间】:2019-01-01 15:53:20
【问题描述】:

我正在使用带有 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),得到了相同的结果。我怎样才能正确使用它? 我正在使用此代码,但它总是返回未定义:

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 文件(不带包)?

【问题讨论】:

  • 您的“XML”文件格式不正确:它包含未定义的实体引用&amp;unc;。所以解析应该失败。

标签: javascript node.js xml


【解决方案1】:

答案在Working Example Link下方

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>

Referenced And Thanks to @tim

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      你使用 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);
           });
      });
      

      您会看到是 &lt;pos&gt;&amp;unc;&lt;/pos&gt; 行导致了问题。 如果您修复 HTML 实体,解析器应该可以正常工作。

      【讨论】:

        猜你喜欢
        • 2015-09-15
        • 2019-02-18
        • 2015-12-25
        • 2021-01-06
        • 2011-05-10
        • 2016-08-14
        • 2012-10-05
        • 2011-05-18
        • 2017-12-22
        相关资源
        最近更新 更多