2009-12-12 8 views
1

J'essaie de comprendre comment obtenir la latitude et la longitude les plus récentes d'un utilisateur de Twitter (à partir des nouvelles données de l'API Geo, à savoir le <geo:point>, vous pouvez voir à quoi elles ressemblent sur my twitter user timeline xml feed). J'ai également besoin de récupérer l'ancienneté de ces données (en secondes) à partir de la balise <created_at>. J'essaye d'écrire ceci en C pour l'utiliser avec un mbed microcontroller donc je ne peux pas utiliser de grandes bibliothèques (idéalement je n'utiliserais pas de librairies, mais ça pourrait être une mauvaise idée). Le site mbed suggère a few light libraries - YAJL et FastXML semble utile - mais ma connaissance C est très basique et je ne suis pas sûr de savoir comment procéder.Analyser les flux Twitter en C

En supposant que j'ai le code pour récupérer une chronologie de l'utilisateur twitter en tant que chaîne et/ou sur le disque (en format JSON ou XML) comment dois-je procéder?

En ce moment je fais ce grattage sur mon serveur web via PHP, mais je préfère l'avoir fait en C car j'espère pouvoir le sortir quand j'aurai fini (et je ne veux pas de mes pauvres serveur étant percuté) Le PHP ressemble à ceci:

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

cela fonctionne assez bien, mais je ne sais pas comment transformer cela en C! Des idées?

Voici un extrait du fichier XML que je me attends à traiter:

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

(BTW, le mbed est génial, je vais avoir un temps incroyable avec elle, malgré mon manque de connaissances avancées en C ou électronique, ils sont in stock at Farnell pour £ 32 et valent vraiment l'argent!)

+2

Si vous publiez le format de certaines structures de données, vous obtiendrez de meilleures réponses. –

+0

Je suppose que je devrais mettre un peu ici plutôt que de simplement pointer vers le flux XML de Twitter - je vais ajouter un extrait - merci –

Répondre

2

En supposant que vous avez tous les flux en mémoire, j'écrirais un analyseur très brut et simple. En premier lieu, j'écrirais un tokenizer de haut niveau. Ce tokenizer renvoie deux types de jetons: Tags XML et autres.

Donc, si vous aviez comme source 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. 

Quelque chose comme ceci:

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 

(mise en garde, mon C est rouillé, il peut bien y avoir des erreurs d'un arrêt dans ici , mais l'essentiel est bon.)

Maintenant que j'obtiens ces méta-parties du XML, c'est simple.

Je scanne simplement des jetons jusqu'à ce que j'en vois un qui commence par votre balise geo. Une fois que vous voyez ceci, vous "savez" que le jeton suivant est votre lat/données longues. Prenez cela, analyser (peut-être avec sscanf), pour obtenir vos valeurs. Cela a pour effet d'aplatir votre espace XML. Vous ne vous souciez pas vraiment de la profondeur de l'étiquette, et vous vous en fichez vraiment, ou quoi que ce soit. Vous présumez que c'est bien formé et conforme.

Du haut de ma tête, je ne sais pas si XML autorise les caractères < ou> dans un attribut d'étiquette entre guillemets, mais même si cela le permet, les chances sont bonnes que ce XML SPECIFIQUE ne le soit pas. travaillera. Sinon, vous devrez analyser les choses citées (pas beaucoup plus difficile, mais ...).

Est-ce robuste? Sûrement pas. Très sensible au GIGO.Mais une vérification simple pour s'assurer que vous ne courez pas la fin des tampons devrait vous sauver là.

+0

Merci! Ce sera excellent pour trouver la première balise geo, mais comment puis-je analyser le 'status' actuel pour obtenir les informations de balise' create_at'? (Et puis comment j'analyse cette chaîne en un certain nombre de secondes jusqu'à maintenant?) –

+0

Combien de tags "created_at" attendez-vous dans la charge utile? Recherchez la balise d'état, définissez un indicateur et recherchez la balise create_at. Je ne sais pas s'il y a une librairie C standard pour lire une chaîne de temps ou pas, sinon vous pouvez probablement utiliser sscanf pour la lire, remplir une struct _tm et utiliser les fonctions C lib time/date. –