解析Twitter的使用C
我试图找出如何获取最新的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 *! 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英镑,绝对物超所值!)
假设你拥有内存中的所有内容,我会写一个非常原始且简单的解析器。
首先,我会写一个高水平的标记生成器。该标记器将返回两种标记: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敏感。但一个简单的检查,以确保你不会跑掉缓冲区结束应该把你救了。
谢谢!这将非常适合找到第一个地理标签,但是我怎样才能扫描当前的'status'来获取'create_at'标签信息呢? (然后,我如何将该字符串解析为几秒钟?) – 2009-12-12 23:15:59
您希望有效载荷中有多少个“created_at”标记?查找状态标签,设置标志,然后查找create_at标签。我不知道是否有一个标准C库读取时间字符串,否则你可以使用sscanf来读取它,填充一个struct _tm并使用C lib时间/日期函数。 – 2009-12-13 01:33:27
如果你发布了一些数据结构的格式,你会得到更好的答案。 – 2009-12-12 22:43:10
我想我应该把一些在这里,而不是只是pointint的twitter XML饲料 - 我会添加一个片段 - 谢谢 – 2009-12-12 22:50:07