如何使用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)); });
- Express JS无法PUT / DELETE
- 与mongoose / node.js共享数据库连接参数的最佳方法
- Mongoose返回empy对象,在mongo shell中工作
- Nodejs + express + OpenId连接redirect到根
- 我如何检查一个请求是通过https快速发送的
- 每个HTTP /会话请求的GLOBAL数据?
- Express.js + body-parser:POST请求中的空req.body
- NodeJS:使用connect-flash的Express 3.0(根据护照本地策略中的build议),仍然发现req.flash的exception
- Mongoose连接方法在简单的节点服务器上失败。 快递,mongoose,path