如何使用节点将大约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)。
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'
才能正常工作。