使用NodeJS读取XML托管文件

时间:2012-02-05 17:00:26

标签: javascript node.js

好的,所以我试图使用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天好了。

1 个答案:

答案 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标记在它与文件开头之间只有空格,但字节顺序标记不算作空格。