2012-02-05 87 views
2

好吧,所以我试图使用多个XML库,NodeJS必须提供,我似乎无法解决如何让NodeJS从网站读取XML文件。阅读XML托管的文件与NodeJS

我可以使用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(“数据”)的部分工作正常,但是输出使用期权(cloud.tfl.gov.uk)无输出即使我将console.log(“hi”)放在数据函数中,它也不会被执行。

我知道url是正确的输出console.log(xml)或console.log(响应)后创建它已连接的变量xml输出。任何帮助将不胜感激,因为我已经坚持了这个好2天了。

回答

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个字节是UTF-8字节顺序标记开始,之后你有标签的开始。 xml-stream预计<?xml标记只在其与文件开头之间留有空白,但字节顺序标记不计为空白。

+1

我实际上不能非常感谢你的帮助,因为这必须改为 var xml = new XmlStream(response,'utf8'); 我不能相信它是如此之小;但我知道它必须是! – 2012-02-05 19:30:09