Массовое преобразование XML в JSON с определенным выводом - PullRequest
0 голосов
/ 20 апреля 2019

Как мне преобразовать приблизительно 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).

1 Ответ

0 голосов
/ 20 апреля 2019

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

...