标题说明了一切,我试图编写一个利用库request
,unzip
和{{}的脚本(在nodejs / express服务器端应用程序中运行)。 1}}执行一个任务,包括从给定的URL获取一个zip文件,其内容是一个xml文件,我需要解析它到一个javascript对象进行进一步处理。
到目前为止,我已设法提出:
xml2js
虽然xml文件的内容已正确写入磁盘,但我正在寻找这种方法的替代方法,原因有两个:
var express = require("express");
var app = express();
/* some init code omitted */
var request = require("request");
var unzip = require("unzip");
var xml2js = require("xml2js");
var parser = new xml2js.Parser();
app.get("/import", function(req, res) {
request("http://path.to/file.zip")
.pipe(unzip.Parse())
.on("entry", function(entry) {
//This is what I'm trying to avoid, which doesn't even work
entry.pipe(fs.createWriteStream(entry.path));
fs.readFile(entry.path, function(err, data) {
if(err) {
return res.status(500).send(err);
}
parser.parseString(data, function(err, obj) {
console.log(util.inspect(obj));
/* further processing of obj */
});
});
});
});
可能会在fs.readFile
完成编写之前开始读取文件,因为行fs.createWriteStream
会记录console.log(utils.inspect(obj))
(如果我只运行最里面的null
块并用先前写入的文件的名称替换fs.readFile
,它产生所需的输出)我希望我可以为此记下一个jsFiddle,但我对于表达应用程序的方式一无所知。欢呼声。
答案 0 :(得分:2)
<强> EDITED 强>
管道是不必要的,直接从条目流解析数据:
app.get("/import", function(req, res) {
request("http://link-top.zip")
.pipe(unzip.Parse())
.on("entry", function(entry) {
var chunks = [];
var res;
if(entry.path == 'needed.xml') {
entry.on('data', function(data) {
chunks.push(data.toString());
});
entry.on('end', function () {
res = chunks.join("");
parser.parseString(res, function(err, obj) {
console.log(util.inspect(obj));
/* further processing of obj */
});
});
}
});
});