2009-12-12 6 views
1

Я пытаюсь выяснить, как получить самую последнюю широту и долготу пользователя Twitter (из новых данных Geo API, т. Е. Тега <geo:point>, вы можете видеть, как они выглядят на my twitter user timeline xml feed). Мне также нужно получить, сколько лет эти данные (в секундах) от тега <created_at>.Parsing Twitter feeds в C

Я пытаюсь написать это в C для использования с mbed microcontroller, поэтому я не могу использовать большие библиотеки (в идеале я бы не использовал библиотеки, но это может быть плохая идея). Сайт mbed предлагает a few light libraries - YAJL и FastXML кажутся вам полезными - но мои знания C очень простые, и я не уверен, как действовать дальше.

Предполагая, что у меня есть код для извлечения временной шкалы пользователя Twitter в виде строки и/или на диск (как JSON или XML), как мне следует продолжить?

На данный момент я делаю это скремблирование на своем веб-сервере с помощью PHP, но я бы предпочел, чтобы это было сделано на C, поскольку я надеюсь выпустить код, когда я закончу (и я не хочу, чтобы мои бедные серверу, который протаранил) РНР выглядит следующим образом:

<?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 или электроники, они in stock at Farnell за £ 32 и, безусловно, стоит денег!)

+2

Если вы разместите формат некоторых структур данных, вы получите более качественные ответы. –

+0

Я предполагаю, что я должен положить здесь немного, а не просто указывать на XML-канал twitter - я добавлю фрагмент - спасибо –

ответ

2

Предполагая, что у вас есть весь канал в памяти, я бы написал очень грубый и простой парсер.

Во-первых, я бы написал токенизатор высокого уровня. Этот токенизатор будет возвращать два типа токенов: 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, это просто.

Я просто просматриваю маркеры, пока не вижу тот, который начинается с вашего тега geo. Как только вы увидите это, вы «знаете» следующий токен - ваши данные lat/long. Возьмите это, проанализируйте его (возможно, с помощью sscanf), чтобы получить свои значения.

Что это значит, это эффективно сгладить пространство XML. Тебе все равно, насколько глубокий тег, и тебе действительно все равно, что он хорошо сформирован или что-то еще. Вы в значительной степени полагаете, что он хорошо сформирован и соответствует.

Из верхней части моей головы я не знаю, поддерживает ли XML символы < или> в атрибуте тега с кавычками, но даже если это разрешено, шансы хороши, что этот СПЕЦИФИЧЕСКИЙ XML не делает, поэтому он Будем работать. В противном случае вам придется разбирать цитируемые материалы (не намного сложнее, но ...).

Является ли это надежным? Конечно нет. Очень чувствительный к GIGO.Но простая проверка, чтобы убедиться, что вы не сбегаете с конца буферов, должна спасти вас там.

+0

Спасибо! Это будет отлично при поиске первого тега geo, но как же я сканирую текущий 'status', чтобы получить информацию тега' create_at'? (И тогда, как я разбираю эту строку за несколько секунд до сих пор?) –

+0

Сколько тэгов «created_at» вы ожидаете в полезной нагрузке? Найдите тег состояния, установите флаг и найдите тег create_at. Я не знаю, есть ли стандартный C lib для чтения строки времени или нет, иначе вы, вероятно, можете использовать sscanf, чтобы прочитать это, заполнить struct _tm и использовать функции времени и даты C lib. –