-1

こんにちは、Cドライブからファイルを解凍しようとしましたが、javascriptオブジェクトに解析しようとしましたが、ここにコードがあります

var AdmZip = require('adm-zip');
var fs = require('fs'), xml2js = require('xml2js');
var parser = new xml2js.Parser();
var paramdata = 'c:/sample/kusuma.zip';
console.log(paramdata);
var zip = new AdmZip(paramdata);
var zipEntries = zip.getEntries();
var obj = [];
var count = 0;
zipEntries.forEach(function(zipEntry) {
    var len = zipEntries.length;
    console.log(zipEntry.toString());
    console.log(zipEntry.entryName);
    fs.readFile("", function(err, data) {
        console.log(data);
        parser.parseString(data, function(err, result) {
            count++;
            console.log(count);
            obj.push(result);

            if (count === len) {
                console.log(obj);
                res.send(obj);
            }

        });
    });

});

コードを一度確認して、さらにいくつかの例を提供してください

4

1 に答える 1

0

まあ、fs.readFile()それ自体がディスク上に直接あるファイルを読み取るためのものですが、これらはそうではありません。

ただし、adm-zipは既に の内容を読み込んでいる.zipので、 は必要ありませんfs。それぞれzipEntrygetData()getDataAsync()コンテンツの取得に使用できるメソッドがあります。

zipEntries.forEach(function (zipEntry) {
    zipEntry.getDataAsync(function (data) {
        parser.parseString(data, function (err, result) {
            console.log(result);
        });
    });
});

また、 と同様zipEntriesArray、 を使用.filter()して XML ファイルのみに縮小することもできます。

var zipEntries = zip.getEntries().filter(function (zipEntry) {
    return !zipEntry.isDirectory && /\.xml$/.test(zipEntry.entryName);
});

lenまた、各エントリからではなく、コレクションから 1 回決定する必要があります。個別obj.lengthに保持するのではなく、使用に対してテストすることもできます。count

var len = zipEntries.length;
var obj = [];

zipEntries.forEach(function (zipEntry) {
    zipEntry.getDataAsync(function (data) {
        parser.parseString(data, function (err, result) {
            obj.push(result);

            if (obj.length === len) {
                res.send(obj);
            }
        });
    });
});
于 2013-08-17T06:43:06.677 に答える