2009-12-12 179 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