2009-12-12 68 views
1

我試圖找出如何獲取最新的Twitter用戶的經度和緯度(來自新的地理API的數據,即<geo:point>標籤飼料,你可以看到他們是如何看起來像my twitter user timeline xml feed )。我還需要從<created_at>標記中檢索數據的年齡(以秒爲單位)。解析Twitter的使用C

我想在C中使用mbed microcontroller來寫這個,所以我不能使用任何大型庫(理想情況下我不會使用任何庫,但這可能是個壞主意)。該mbed網站建議a few light libraries - YAJL和FastXML似乎很有用 - 但我的C知識是非常基本的,我不確定如何繼續。

假設我有用於檢索Twitter用戶的時間表到存儲器作爲字符串和/或磁盤的代碼(如JSON或XML)應該怎麼繼續?

目前我正在通過PHP在我的網絡服務器上進行這項操作,但我寧願在C中完成它,因爲我希望在完成時釋放代碼(並且我不希望我的窮人服務器被夯)的PHP看起來是這樣的:

<?php 
date_default_timezone_set('UTC'); 
try { 
    $tweets = json_decode(file_get_contents("http://twitter.com/statuses/user_timeline.json?screen_name=".urlencode($_GET['screenname']))); 
    foreach($tweets as $tweet) { 
    if (is_array($tweet->geo->coordinates)) { 
     echo date("U") - strtotime($tweet->created_at); 
     echo ",{$tweet->geo->coordinates[0]},{$tweet->geo->coordinates[1]}"; 
     break; 
    } 
    } 
} catch (Exception $e) { 
    exit(); 
} 

這工作得相當好,但我不知道如何把這個放到C!有任何想法嗎?

這是我很期待來處理XML的一個片段:

<statuses type="array"> 
<status> 
    <created_at>Sat Dec 12 22:25:17 +0000 2009</created_at> 
    <id>6611101548</id> 
    <text>Hello stackoverflow! This tweet is geotagged.</text> 
    <other tags/> 
    <geo> 
    <georss:point>52.946972 -1.182846</georss:point> 
    </geo> 
</status> 
<status ...> 
</statuses> 

(順便說一句,在mbed是真棒,我有一個驚人的時間與它,儘管我缺乏用C先進的知識或電子產品,它們是in stock at Farnell,價格爲32英鎊,絕對物超所值!)

+2

如果你發佈了一些數據結構的格式,你會得到更好的答案。 – 2009-12-12 22:43:10

+0

我想我應該把一些在這裏,而不是隻是pointint的twitter XML飼料 - 我會添加一個片段 - 謝謝 – 2009-12-12 22:50:07

回答

2

假設你擁有內存中的所有內容,我會寫一個非常原始且簡單的解析器。

首先,我會寫一個高水平的標記生成器。該標記器將返回兩種標記:XML標記和其他。

所以,如果你有一個XML源:

<tag arg="stuff"> 
    <tag2>data</tag2> 
</tag> 

That would return "<tag arg="stuff">" as the first token, " 
    " (note newline) in the second token, "<tag2>" in the third, "data" in the forth. 

事情是這樣的:在這裏

char *p = bufPtr; 
char *start = p; 
char *token; 
char target; 

if (*p == '<') { 
    // found the start of a tag, lets look for the end 
    target = '>'; 
} else { 
    // not in a tag, so we'll search for one 
    target = '<'; 
} 
p++; 
while (*p != target) { 
    p++; 
} 
int length = p - start; 
result = malloc(length + 1); 
memcpy(result, start, length); 
*(token + length) = '\0'; // terminate result string 
bufPtr = p; // advance for the next token 

(警告,我的C是生鏽的,很可能有一些一次性的錯誤,但關鍵還是不錯的。)

現在,我得到了XML的這些元塊,它的簡單。

我只是掃描記號,直到我看到一個與您的地理標籤開始。一旦你看到這個,你「知道」下一個標記是你的緯度/經度數據。抓住它,解析它(也許用sscanf),以獲得你的價值觀。

這樣做是有效的扁平化你的XML空間。你真的不在意標籤有多深,而且你真的不在乎它是否完好,或者其他任何東西。你幾乎認爲它的結構合理。我不知道XML是否允許<或>字符在引用標籤屬性中,但即使它允許它,賠率也是好的,因爲這個具體的XML不會,所以它會工作。否則,你需要解析引用的東西(沒那麼難,但是...)。

這是強健?一定不行。非常GIGO敏感。但一個簡單的檢查,以確保你不會跑掉緩衝區結束應該把你救了。

+0

謝謝!這將非常適合找到第一個地理標籤,但是我怎樣才能掃描當前的'status'來獲取'create_at'標籤信息呢? (然後,我如何將該字符串解析爲幾秒鐘?) – 2009-12-12 23:15:59

+0

您希望有效載荷中有多少個「created_at」標記?查找狀態標籤,設置標誌,然後查找create_at標籤。我不知道是否有一個標準C庫讀取時間字符串,否則你可以使用sscanf來讀取它,填充一個struct _tm並使用C lib時間/日期函數。 – 2009-12-13 01:33:27