1

Twitter ユーザーの最新の緯度と経度を取得する方法を見つけようとしています (新しい Geo API データ、つまりタグから、Twitter ユーザーのタイムライン xml フィード<geo:point>でそれらがどのように見えるかを確認できます)。また、そのデータの経過時間 (秒単位) をタグから取得する必要もあります。<created_at>

mbed マイクロコントローラーで使用するためにこれを C で記述しようとしているため、大きなライブラリを使用できません (理想的にはライブラリを使用しないのが理想ですが、それは悪い考えかもしれません)。mbed サイトではいくつかの軽いライブラリを提案しています- YAJLと FastXML は役に立ちそうです - しかし、私の C 知識は非常に基本的なものであり、どのように進めればよいかわかりません。

Twitter ユーザーのタイムラインを文字列として、および/またはディスク (JSON または XML) としてメモリに取得するためのコードがあると仮定すると、どのように進めればよいでしょうか?

現時点では、PHP を介して Web サーバーでこのスクレイピングを行っていますが、完了したらコードをリリースしたいので、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 や電子機器に関する高度な知識がないにもかかわらず、素晴らしい時間を過ごしています。Farnellに 32 ポンドで在庫があり、間違いなくお金の価値があります!)

4

1 に答える 1

2

すべてのフィードがメモリにあると仮定すると、非常に粗雑で単純なパーサーを作成できます。

まず、高レベルのトークナイザーを作成します。このトークナイザーは、XML タグとその他の 2 種類のトークンを返します。

したがって、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 は錆びています。ここに 1 回限りのエラーがある可能性がありますが、要点は適切です。)

XML のこれらのメタ チャンクを取得したので、簡単です。

あなたのジオタグで始まるトークンが見つかるまで、トークンをスキャンします。これを見れば、次のトークンが緯度/経度データであることが「わかります」。それをつかみ、(おそらくsscanfで)解析して、値を取得します。

これにより、XML スペースが効果的にフラット化されます。タグの深さは気にしませんし、整形式であることも気にしません。あなたは、それが適切に形成され、適合しているとほとんど想定しています。

頭のてっぺんでは、引用符で囲まれたタグ属性内で XML が < または > 文字を許可するかどうかはわかりませんが、許可されたとしても、この SPECIFIC XML が許可しない可能性は高いので、うまくいくでしょう。それ以外の場合は、引用されたものを解析する必要があります (それほど難しくはありませんが...)。

これは頑丈ですか?地獄いいえ。非常にGIGOに敏感です。ただし、バッファーの端からはみ出していないことを確認する簡単なチェックで、そこに保存されるはずです。

于 2009-12-12T22:50:45.897 に答える