gpt4 book ai didi

xml - 如何使用 Node 从 URL 解析 XML

转载 作者:IT老高 更新时间:2023-10-28 23:02:42 26 4
gpt4 key购买 nike

我正在使用 node-xml2js解析 XML。我在从 URL 解析 XML 时遇到问题。我用过这个SO answer作为模特。但是当我使用下面的代码时,我得到 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 能够通过它的 block 来解析 xml,所以我们需要缓冲整个 http 响应。为此,我在这里使用了 global,但最好使用 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);
});
});
}
});

只有当响应结束发送时,我们才解析 XML。 xml2js 使用 sax 似乎有流媒体支持,但不确定 xml2js 是否利用它。

我创建了一个小示例,它使用逐 block 解析(类似于您的示例),但在解析时失败,因为在一个 block 中无效 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);
});
}));

});

您可以使用 sax 来不缓冲整个文件(以防您的 xml 文件很大),但它的级别更低,但是将其作为流进行管道传输非常相似。

关于xml - 如何使用 Node 从 URL 解析 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34007206/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com