Domanda

Sto cercando di capire come ottenere la latitudine e la longitudine più recente di un utente Twitter (dai nuovi dati API Geo, ovvero il tag <geo:point>, si può vedere come si presentano su il mio utente timeline di Twitter XML ). Ho anche bisogno di recuperare quanti anni che i dati siano (in secondi) dal tag <created_at>.

Sto cercando di scrivere questo in C da usare con un mbed microcontrollore quindi non può usare qualsiasi grande librerie (idealmente non vorrei usare le librerie, ma che potrebbe essere una cattiva idea). Il sito suggerisce mbed alcune librerie di luce - YAJL e FastXML sembrare utile - ma la mia conoscenza C è molto semplice e sono sicuri di come procedere

Supponendo Ho il codice per il recupero una timeline utente Twitter in memoria come una stringa e / o su disco (sia come JSON o XML) come devo procedere?

Al momento sto facendo questo raschiare sul mio webserver tramite PHP, ma preferirei averlo fatto in C come spero di rilasciare il codice quando ho finito (e non voglio il mio povero assistente ! essere speronato) Il PHP è simile al seguente:

<?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();
}

Questo funziona abbastanza bene, ma non ho idea di come trasformare questo in C! Tutte le idee?

Ecco un frammento del XML mi aspetto da affrontare:

<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>

(a proposito, il mbed è impressionante, sto avendo un tempo incredibile con esso, nonostante la mia mancanza di conoscenze avanzate in C o elettronica, sono in giacenza presso Farnell per £ 32 e sicuramente vale la pena!)

È stato utile?

Soluzione

Supponendo di avere tutti i mangimi in memoria, vorrei scrivere un molto grezzo, e semplice, parser.

Per prima cosa, mi piacerebbe scrivere un tokenizzatore alto livello. Questo tokenizer sarebbe tornato due tipi di gettoni.: Modifiche XML e altri

Quindi, se si ha come fonte 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.

Qualcosa di simile a questo:

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

(avvertimento, il mio C è arrugginito, non ci potrebbe essere qualche una tantum errori di qui, ma il succo è buono.)

Ora che sto ottenendo questi meta pezzi del XML, è semplice.

Ho appena scansione gettoni fino a quando ne vedo uno che inizia con il tag geo. Quando vedi questo, è "conoscere" il prossimo token è i dati di lat / long. Afferra che, analizzarlo (magari con sscanf), per ottenere i vostri valori.

Quello che fa è appiattire efficacemente lo spazio XML. In realtà non importa quanto è profonda la tag è, e davvero non si cura è ben formata, o niente. Sei praticamente ammesso che sia ben formata e conforme.

della parte superiore della mia testa, non so se XML permette caratteri all'interno di un attributo di tag citato, ma anche se non lo permette, ci sono buone probabilità che questo XML specifico non lo fa, quindi è' ll lavoro. In caso contrario, sarà necessario analizzare roba citato (non che molto più difficile, ma ...).

E 'questo robusto? Diavolo, no. Molto GIGO sensitive. Ma un semplice controllo per assicurarsi che non si esegue fuori alla fine buffer dovrebbe risparmiare lì.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top