#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 и просто не мог разобраться в этой проблеме.