1


3

CでのTwitterフィードの解析

Twitterユーザーの最新の緯度と経度を取得する方法を見つけようとしています(新しいGeo APIデータ、つまり タグから、http://twitter.com/でそれらがどのように見えるかを見ることができますstatuses / user_timeline.xml?screen_name = jphastings [my twitter user timeline xml feed])。 また、そのデータの古さを(秒単位で) タグから取得する必要があります。

私はこれをCで書いてhttp://mbed.org [mbedマイクロコントローラ]で使用しようとしているので、大きなライブラリを使用できません(理想的にはライブラリを使用しませんが、それは悪い考えかもしれません)。 mbedサイトは、http://mbed.org/users/rolf/notebook/random-libraries/ [いくつかのライトライブラリ]-http://lloyd.github.com/yajl/[YAJL]とFastXMLが役立つように提案しています - しかし、私のCの知識は非常に基本的なものであり、どのように進めればよいかわかりません。

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

現時点では、PHPを介してWebサーバーでこのスクレイピングを行っていますが、終了したらコードをリリースしたいので、Cでやったほうがいいです(そして、貧しいサーバーが突っ込んで欲しくありません! )PHPは次のよ​​うになります。

created_at);
      echo ",{$tweet->geo->coordinates[0]},{$tweet->geo->coordinates[1]}";
      break;
    }
  }
} catch (Exception $e) {
  exit();
}

これはかなりうまく機能しますが、これをCに変換する方法がわかりません。 何か案は?

これが、私が扱うことを期待しているXMLのスニペットです。

  Sat Dec 12 22:25:17 +0000 2009
  6611101548
  Hello stackoverflow! This tweet is geotagged.


   52.946972 -1.182846

(ところで、mbedは素晴らしいです。Cや電子機器の高度な知識がなくても素晴らしい時間を過ごしています。彼らはhttp://uk.farnell.com/nxp/om11043/kit-mbed-prototypingです。 -board-lpc1768 / dp / 1761179 [ファーネルで在庫] 32ポンドで、間違いなくお金の価値がある!)

1 Answer


2


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

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

したがって、XMLソースとして持っている場合:

    data


That would return "" as the first token, "
    " (note newline) in the second token, "" 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に敏感です。 ただし、バッファの最後から実行されないようにするための簡単なチェックは、そこにあなたを保存する必要があります。