Вопрос

Я пытаюсь выяснить, как получить самую последнюю широту и долготу пользователя Twitter (из новых данных Geo API, т.е. <geo:point> тег, вы можете увидеть, как они выглядят на XML-канал моей временной шкалы пользователя в Твиттере).Мне также нужно получить, сколько лет этим данным (в секундах) из <created_at> ярлык.

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

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

В настоящий момент я выполняю очистку своего веб-сервера через PHP, но я бы предпочел, чтобы это было сделано на 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 или электронике, они в наличии в Фарнелле за 32 фунта и определенно стоит своих денег!)

Это было полезно?

Решение

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

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

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

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

На мой взгляд, я не знаю, допускает ли XML символы < или > в атрибуте тега в кавычках, но даже если он это допускает, велика вероятность, что этот КОНКРЕТНЫЙ XML не поддерживает, поэтому он будет работать.В противном случае вам придется анализировать цитируемые материалы (не намного сложнее, но...).

Это надежно?Конечно нет.Очень чувствителен к ГИГО.Но простая проверка, чтобы убедиться, что вы не выходите за пределы буфера, должна спасти вас.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top