Pregunta

Estoy tratando de encontrar la manera de obtener la más reciente latitud y longitud de un usuario de Twitter (a partir de los nuevos datos de la API Geo, es decir, la etiqueta <geo:point>, se puede ver cómo se vería en mi usuario de twitter línea de tiempo xml feed ). También necesito para recuperar la edad que los datos son (en segundos) de la etiqueta <created_at>.

Estoy tratando de escribir esto en C para usar con un mbed microcontrolador por lo que no puede utilizar cualquier gran bibliotecas (lo ideal es que no se utiliza ninguna bibliotecas, pero que podría ser una mala idea). El sitio de mbed sugiere algunas bibliotecas de luz - YAJL y FastXML parece útil - pero mi conocimiento C es muy básico y estoy seguro de cómo proceder

Suponiendo que tengo el código para recuperar una línea de tiempo usuario de twitter en la memoria como una cadena y / o en el disco (ya sea como JSON o XML) ¿cómo debo proceder?

En el momento que estoy haciendo esto raspado en mi servidor web a través de PHP, pero prefiero que he hecho en C como espero para liberar el código cuando he terminado (y no quiero que mi pobre servidor ! ser embestido) El PHP es el siguiente:

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

Esto funciona bastante bien, pero no tengo ni idea de cómo convertir esto en C! ¿Alguna idea?

He aquí un fragmento del XML que estoy esperando para hacer frente a:

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

(por cierto, el mbed es impresionante, estoy teniendo un tiempo increíble con ella a pesar de mi falta de conocimientos avanzados en C o electrónica, que son en stock en Farnell por 32 £ y definitivamente vale la pena el dinero!)

¿Fue útil?

Solución

Asumiendo que tiene toda la alimentación en la memoria, me gustaría escribir una muy cruda y simple, analizador.

En primer lugar, me gustaría escribir un alto nivel de tokenizer. Este tokenizer volvería dos tipos de fichas:. XML etiquetas y otras

Por lo tanto, si usted tenía como fuente 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.

Algo como esto:

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

(advertencia, mi C es oxidado, bien puede haber algunos errores en uno fuera de aquí, pero la esencia es buena.)

Ahora que estoy recibiendo estos trozos meta del XML, es sencillo.

Sólo escaneo fichas hasta que veo que empieza con su etiqueta de geo. Una vez que vea esto, se "sabe" es el siguiente token sus datos de latitud / longitud. Coge que, analizarlo (tal vez con sscanf), para obtener sus valores.

Lo que esto hace que se aplane eficacia con la que el espacio XML. En realidad, no importa qué tan profundo es la etiqueta, y que realmente no le importa que esté bien formado, ni nada. Que está bastante suponiendo que esté bien formado y que se ajuste.

De la parte superior de mi cabeza, no sé si XML permite a los caracteres dentro de un atributo de etiqueta citado, pero incluso si no lo permite, más probable es que este XML específico no lo hace, por lo que' ll trabajo. De lo contrario tendrá que analizar las cosas cotizado (no es que mucho más difícil, pero ...).

Es este robusto? Por supuesto que no. Muy Gigo sensible. Pero una simple comprobación para asegurarse de que no se quede fuera de la final tampones que debe guardar allí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top