2012-02-05 103 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