Массовое преобразование XML в JSON с определенным выводом

#javascript #node.js #json #xml #bluebird

#javascript #node.js #json #xml #bluebird

Вопрос:

Как мне преобразовать около 3000 XML-файлов в файлы JSON с помощью node?

Я смог преобразовать приведенный ниже скрипт в один файл 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).

Ответ №1:

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' , чтобы он работал правильно.

Комментарии:

1. Спасибо, это полезно. Обучение node.js и просто не мог разобраться в этой проблеме.