好的,所以我试图使用NodeJS提供的多个XML库,我似乎无法弄清楚如何让NodeJS从网站读取XML文件。
我可以使用http.request,http.get以及所有这些来提取文件,但是让NodeJS能够对XML文件中的数据实际执行任何操作是另一回事。
我确信我必须遗漏一些东西,就像我用xml-stream将XML转换为JS一样;它无法从网站上使用它;我的代码在托管文件时运行,但我使用的是api,他们只使用XML。
当前代码:
var http = require('http');
var XmlStream = require('xml-stream');
var options = { host: 'cloud.tfl.gov.uk',
path: '/TrackerNet/LineStatus'};
var twitter = { host: 'api.twitter.com',
path: '/1/statuses/user_timeline.rss?screen_name=nwhite89'}
var request = http.get(options).on('response', function(response) {
response.setEncoding('utf8');
var xml = new XmlStream(response);
xml.on('updateElement: item', function(item) {
item.title = item.title.match(/^[^:]+/)[0] + ' on ' +
item.pubDate.replace(/ +[0-9]{4}/, '');
});
xml.on('text: item > pubDate', function(element) {
element.$text = element.$text;
});
xml.on('data', function(data) {
process.stdout.write(data);
});
});
我不明白是使用Twitter在xml.on(“data”)部分使用精细输出但是使用选项(cloud.tfl.gov.uk)即使我放入console.log(“hi”)也没有输出)在数据函数内部,它不会被执行。
我知道在创建已连接的变量xml输出后,url正确输出console.log(xml)或console.log(响应)。任何帮助将非常感谢,我已经坚持了2天好了。
答案 0 :(得分:6)
<?xml
标记之前有一个字节顺序标记,xml-stream在某个位上跳起来并阻止它读取标记中的编码。这意味着你需要自己提供它。
而不是:
response.setEncoding('utf8');
var xml = new XmlStream(response);
这样做:
response.setEncoding('utf8');
var xml = new XmlStream(response, 'utf8');
实际上,在流上设置编码是可选的。
var xml = new XmlStream(response, 'utf8');
工作正常。
此处有更多信息:http://en.wikipedia.org/wiki/Byte_order_mark#UTF-8
如果查看从response
而不是xml
发出的缓冲区,缓冲区将以
<Buffer ef bb bf 3c 3f 78 6d ...>
前3个字节是utf8的字节顺序标记,然后你有标记的开头。 xml-stream
期望<?xml
标记在它与文件开头之间只有空格,但字节顺序标记不算作空格。