解压缩文件并将其解析为js

时间:2013-08-17 05:35:21

标签: node.js

嗨我试图从我的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);
            }

        });
    });

});

请检查一次代码并提供更多示例

1 个答案:

答案 0 :(得分:0)

好吧,fs.readFile()用于读取本身直接在磁盘上的文件,而这些文件不是。

但是,adm-zip已经在阅读.zip的内容,因此您不需要fs。每个zipEntry都有getData()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一次,而不是从每个条目中确定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); } }); }); });

{{1}}