如何使用Nodeparsing来自URL的XML

我正在使用node-xml2js来parsingXML。 我无法从URLparsingXML。 我用这个答案作为模型。 但是当我使用下面的代码时,结果是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); }); 

我没有看到xml2js能够通过它的块来parsingxml,所以我们需要缓冲整个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); }); }); } }); 

只有当响应结束发送,然后我们parsingXML。 xml2js使用sax似乎有stream支持,但不知道如果xml2js利用它。

我已经创build了一个小块的例子,它使用块分块(类似于你的例子),但是它在分析时失败,因为在一个块无效xml到达 – 这就是为什么我们需要缓冲整个响应。

如果你的xml非常大,可以尝试不同的parsing器,比如sax ,它有stream支持。

您还可以将error处理程序添加到parser以便在遇到错误时能够打印错误。

Concatstream

使用concatstream,您可以更优雅地连接所有.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); }); })); }); 

你可以使用sax来缓冲整个文件(如果你的xml文件比较大),但是它比较低级别,但是把它作为streampipe道是非常相似的。

根据你的问题,解决scheme应该是这样的。

两个选项都按预期工作,并提供一个有效的XML的JSON对象。 您可以按照xml2js的read.me中所述configuration如何parsingxml

本地人


 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); }); }); 

ASYNC *没有callback地狱


 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.'); } }); 

使用xml2js ,这非常简单。

 var parseString = require('xml2js').parseString; var xmldata = "XML output from the url"; console.log(xmldata); parseString(xmldata, function (err, result) { // Result contains XML data in JSON format }); 
 var https = require('https'); var parseString = require('xml2js').parseString; var xml = ''; function xmlToJson(url, callback) { var req = https.get(url, function(res) { var xml = ''; res.on('data', function(chunk) { xml += chunk; }); res.on('error', function(e) { callback(e, null); }); res.on('timeout', function(e) { callback(e, null); }); res.on('end', function() { parseString(xml, function(err, result) { callback(null, result); }); }); }); } var url = "https://tsdrapi.uspto.gov/ts/cd/casestatus/sn78787878/info.xml" xmlToJson(url, function(err, data) { if (err) { // Handle this however you like return console.err(err); } // Do whatever you want with the data here // Following just pretty-prints the object console.log(JSON.stringify(data, null, 2)); });