使用特定输出将XML批量转换为JSON

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

如何使用节点将大约3000个XML文件转换为JSON文件?

我已经能够以我想要的格式将下面的脚本添加到单个XML到JSON文件中,并且我一直在尝试使用bluebird来宣传脚本,但我一直在收到错误。我已经能够得到下面的脚本列出文件名,但后来我收到错误“未处理拒绝错误:ENOENT:没有这样的文件或目录,打开'journal-article-10.2307_357359.xml'”

var Promise = require('bluebird');
var fs = require('fs');
var convert = require('xml-js');

fs.readdirAsync = function(dirname) {
    return new Promise(function(resolve, reject) {
        fs.readdir(dirname, function(err, filenames){
            if (err)
                reject(err);
            else
                resolve(filenames);
        });
    });
};

fs.readFileAsync = function(filename, enc) {
    return new Promise(function(resolve, reject) {
        fs.readFile(filename, enc, function(err, data){
            if (err)
                reject(err);
            else
                resolve(data);
        });
    });
};

function getFile(filename) {
    return fs.readFileAsync(filename, 'utf8');
}

fs.readdirAsync('./metadata/').then(function (filenames){
    console.log(filenames);
    return Promise.all(filenames.map(getFile));
}).then(function (files){
  files.forEach(function(files){
    function nativeType(value) {
      var nValue = Number(value);
      if (!isNaN(nValue)) {
        return nValue;
      }
      var bValue = value.toLowerCase();
      if (bValue === 'true') {
        return true;
      } else if (bValue === 'false') {
        return false;
      }
      return value;
    }
    var removeJsonTextAttribute = function(value, parentElement) {
      try {
        var keyNo = Object.keys(parentElement._parent).length;
        var keyName = Object.keys(parentElement._parent)[keyNo - 1];
        parentElement._parent[keyName] = nativeType(value);
      } catch (e) {}
    };
    var options = {
      compact: true,
      trim: true,
      ignoreDeclaration: true,
      ignoreInstruction: true,
      ignoreAttributes: true,
      ignoreComment: true,
      ignoreCdata: true,
      ignoreDoctype: true,
      textFn: removeJsonTextAttribute,
      spaces: 2
    };
    fs.writeFile("./json/" + fileaname + ".json", convert.xml2json(options));
  });
});

我希望能够将整个XML文件夹转换为JSON(上传到couchDB)。

javascript node.js json xml bluebird
1个回答
0
投票

ENOENT是标准的POSIX错误代码,表示找不到该文件的路径。您已尝试打开不存在的文件或目录的名称。在这种情况下,fs.readdir返回的名称不是完全限定的文件名,因此您需要在它们前面加上您提供的路径,特别是:'./metadata/'。您看到的错误消息告诉您打开的文件:journal-article-10.2307_357359.xml,但在这种情况下,您可能想要打开./metadata/journal-article-10.2307_357359.xml

您可以通过以下简单示例看到这一点:

# Create a dummy directory named `garbage` that contains only 3 entries
$ mkdir -p garbage/{foo,bar,baz}
# Run `node` interactively
$ node
> const fs = require('fs');
undefined
> fs.readdirSync('./garbage')
[ 'bar', 'baz', 'foo' ]

打开'bar'是没有意义的,因为那不存在。您需要打开'./garbage/bar'才能正常工作。

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