【问题标题】:Parsing Twitter feeds in C在 C 中解析 Twitter 提要
【发布时间】:2009-12-12 22:23:00
【问题描述】:

我正在尝试弄清楚如何获取 Twitter 用户的最新纬度和经度(来自新的 Geo API 数据,即<geo:point> 标签,您可以在my twitter user timeline xml feed 上看到它们的样子) .我还需要从<created_at> 标记中检索该数据的年龄(以秒为单位)。

我正在尝试用 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 的 sn-p:

<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 英镑,绝对物有所值!)

【问题讨论】:

  • 如果你把一些数据结构的格式贴出来,你会得到更好的答案。
  • 我想我应该在这里放一些,而不是仅仅指向 twitter XML 提要 - 我会添加一个 sn-p - 谢谢

标签: c xml json twitter microcontroller


【解决方案1】:

假设您在内存中拥有所有提要,我会编写一个非常粗略且简单的解析器。

首先,我会编写一个高级标记器。此标记器将返回两种类型的标记: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 是否允许在带引号的标记属性中使用 字符,但即使它允许,这个 SPECIFIC XML 也很有可能不允许,所以它会工作的。否则你需要解析引用的东西(不是那么难,但是......)。

这很健壮吗?一定不行。非常GIGO敏感。但是一个简单的检查来确保你没有跑出缓冲区结束应该可以救你。

【讨论】:

  • 谢谢!这将非常适合查找第一个地理标签,但是我如何扫描当前的status 以获取create_at 标签信息? (然后我如何将该字符串解析成几秒钟?)
  • 您希望有效载荷中有多少“created_at”标签?查找状态标记,设置标志,然后查找 create_at 标记。我不知道是否有标准的 C lib 来读取时间字符串,否则您可能可以使用 sscanf 来读取它,填充 struct _tm 并使用 C lib 时间/日期函数。
猜你喜欢
  • 1970-01-01
  • 2012-04-02
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-30
  • 2014-06-18
  • 2012-10-19
相关资源
最近更新 更多