我正在试图弄清楚如何获取Twitter用户的最新纬度和经度(来自新的Geo API数据,即<geo:point>
标记,您可以看到它们在{{{{{ 3}})。我还需要从<created_at>
标记中检索该数据的年龄(以秒为单位)。
我正在尝试用C语言编写它以与my twitter user timeline xml feed一起使用,所以我不能使用任何大型库(理想情况下我不会使用任何库,但这可能是一个坏主意)。 mbed网站建议mbed microcontroller - a few light libraries和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语言或电子学方面的高级知识,我仍然度过了一段美好的时光,他们只需32英镑YAJL,绝对物有所值!)< / p>
答案 0 :(得分:2)
假设你拥有内存中的所有feed,我会写一个非常粗糙,简单的解析器。
首先,我会写一个高级标记器。此tokenizer将返回两种类型的标记: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是否允许&lt;或者&gt;引用标记属性中的字符,但即使它允许它,这个SPECIFIC XML没有的好处,所以它会工作。否则你需要解析引用的东西(不是那么难,但是......)。
这很健壮吗?一定不行。非常GIGO敏感。但是,一个简单的检查,以确保你没有运行缓冲区结束应该可以节省你。