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

Bulk convert XML to JSON with particular output

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

我已经能够将下面的脚本以我想要的格式保存到单个 XML 到 JSON 文件中,并且我一直在尝试使用 bluebird 对脚本进行 promisify,但我不断收到错误。我已经能够获取下面的脚本来列出文件名,但随后出现错误 "Unhandled rejection Error: ENOENT: no such file or directory, open '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)。

ENOENT 是标准的 POSIX 错误代码,表示未找到文件路径。您试图打开一个不存在的文件或目录的名称。在这种情况下,fs.readdir returns 名称不是完全限定的文件名,因此您需要在它们前面加上您提供的路径,具体来说:'./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' 才能正常工作。