Ken*_*Ken 15 xml node.js xml-parsing express
我使用node-xml2js来解析XML.我在从URL解析XML时遇到问题.我用这个SO答案作为模型.但是当我使用下面的代码时,我得到null了结果.对我做错了什么的想法?
更新:我已将xml的url更新为使用的实际站点.
var eyes = require('eyes');
var https = require('https');
var fs = require('fs');
var xml2js = require('xml2js');
var parser = new xml2js.Parser();
parser.addListener('end', function(result) {
eyes.inspect(result);
console.log('Done.');
});
https.get('https://tsdrapi.uspto.gov/ts/cd/casestatus/sn78787878/info.xml', function(result) {
result.on('data', function (data) {
parser.parseString(data);
});
}).on('error', function(e) {
console.log('Got error: ' + e.message);
});
Run Code Online (Sandbox Code Playgroud)
edi*_*n-m 18
我没有看到xml2js能够通过它的块来解析xml,所以我们需要缓冲整个http响应.要做到这一点,我在这里使用了全局,但最好使用类似的东西concat-stream(我稍后会发布).
我试过这个,它对我有用:
var eyes = require('eyes');
var https = require('https');
var fs = require('fs');
var xml2js = require('xml2js');
var parser = new xml2js.Parser();
parser.on('error', function(err) { console.log('Parser error', err); });
var data = '';
https.get('https://tsdrapi.uspto.gov/ts/cd/casestatus/sn78787878/info.xml', function(res) {
if (res.statusCode >= 200 && res.statusCode < 400) {
res.on('data', function(data_) { data += data_.toString(); });
res.on('end', function() {
console.log('data', data);
parser.parseString(data, function(err, result) {
console.log('FINISHED', err, result);
});
});
}
});
Run Code Online (Sandbox Code Playgroud)
只有当响应结束发送时,我们才解析XML.xml2js使用sax似乎有流媒体支持,但不确定是否xml2js利用它.
我创建了一个小例子,它使用chunk-by-chunk解析(类似于你的例子)但是在解析时它没有给出错误,因为在块中无效xml到达 - 这就是我们需要缓冲整个响应的原因.
如果您的xml非常大,请尝试不同的解析器,例如sax具有流支持.
您还可以添加error处理程序,parser以便在遇到错误时能够打印错误.
使用concat流,您可以更优雅地连接所有.on('data'...)呼叫:
var https = require('https');
var xml2js = require('xml2js');
var parser = new xml2js.Parser();
var concat = require('concat-stream');
parser.on('error', function(err) { console.log('Parser error', err); });
https.get('https://tsdrapi.uspto.gov/ts/cd/casestatus/sn78787878/info.xml', function(resp) {
resp.on('error', function(err) {
console.log('Error while reading', err);
});
resp.pipe(concat(function(buffer) {
var str = buffer.toString();
parser.parseString(str, function(err, result) {
console.log('Finished parsing:', err, result);
});
}));
});
Run Code Online (Sandbox Code Playgroud)
您可以使用sax不能缓冲整个文件(如果您的xml文件很大),但它更低级别,但是将它作为流管道非常相似.
根据您的问题,解决方案应该是这样的。
这两个选项都按预期工作,并提供了 xml 的有效 json 对象。您可以按照xml2js的read.me中的描述配置如何解析xml
本国的
var eyes = require('eyes'),
https = require('https'),
fs = require('fs'),
xml2js = require('xml2js'),
parser = new xml2js.Parser();
https.get('https://tsdrapi.uspto.gov/ts/cd/casestatus/sn78787878/info.xml', function(res) {
var response_data = '';
res.setEncoding('utf8');
res.on('data', function(chunk) {
response_data += chunk;
});
res.on('end', function() {
parser.parseString(response_data, function(err, result) {
if (err) {
console.log('Got error: ' + err.message);
} else {
eyes.inspect(result);
console.log('Done.');
}
});
});
res.on('error', function(err) {
console.log('Got error: ' + err.message);
});
});
Run Code Online (Sandbox Code Playgroud)
ASYNC *没有回调地狱
var eyes = require('eyes'),
https = require('https'),
async =require('async'),
xml2js = require('xml2js');
async.waterfall([
function(callback) {
https.get('https://tsdrapi.uspto.gov/ts/cd/casestatus/sn78787878/info.xml', function(res) {
var response_data = '';
res.setEncoding('utf8');
res.on('data', function(chunk) {
response_data += chunk;
});
res.on('end', function() {
callback(null, response_data)
});
res.on('error', function(err) {
callback(err);
});
});
},
function(xml, callback) {
var parser = new xml2js.Parser();
parser.parseString(xml, function(err, result) {
if (err) {
callback(err);
} else {
callback(null, result);
}
});
},
function(json, callback) {
// do something usefull with the json
eyes.inspect(json);
callback();
}
], function(err, result) {
if (err) {
console.log('Got error');
console.log(err);
} else {
console.log('Done.');
}
});
Run Code Online (Sandbox Code Playgroud)