De XML a JSON con javascript... incluyendo namespaces

Durante estos días he estado haciendo un Google Gadget para todoexpertos.com, web de la que me estoy encargando desde el mes de Abril, tras un par de meses de trabajo junto con mi compañero Richard.

La verdad es que a mí estas cosas me divierten bastante. De hecho, aprovechando he hecho otro gadget para una de mis páginas (playsudoku).

Pero bueno, a lo que vamos. La API de Google Gadgets es muy potente, pero siempre hay algunas cositas mejorables. En mi escenario, lo que pretendo hacer es acceder a la API de Todoexpertos.com (que también he creado yo ) que funciona mediante llamadas REST y devuelve RSS con el Namespace de Todoexpertos incluido. un ejemplo del RSS que devuelve es el siguiente:

<?xml version="1.0"?>
<rss version="2.0"  xmlns:te="http://www.todoexpertos.com/api/te">
  <channel>
    <title>GetExpertCategories</title>
    <link>Url de la API</link>
    <description>Recoge las categorías de un experto.</description>
    <item>
          <title>Arte y ocio</title>
          <te:CategoryPath>/arte-y-ocio</te:CategoryPath>
          <te:CategoryUrl>http://www.todoexpertos.com/categorias/arte-y-ocio/</te:CategoryUrl>

    </item>
  </channel>
</rss>


Pues bien, la API de Google Gadgets ofrece la función "_IG_FetchFeedAsJSON()" mediante la que se accede a la URL de un RSS o un ATOM y te la transforma en JSON, de forma que es sencillísimo manejar el resultado con Javascript (prometo un futuro artículo de JSON).

El problema es que cuando incluyes namespaces al RSS (algo permitido en RSS 2.0), 
"_IG_FetchFeedAsJSON()" no las reconoce!! (o yo no he sabido hacerlo bien ).

Pero bueno, que no cunda el pánico, Google ofrece otra función, "
_IG_FetchXmlContent()", que recoge un XML desde la url que le des como parámetros. Sí, de ese modo sí funciona... pero, ¿por qué tengo que usar XML pudiendo usar JSON?

De modo que me puse a investigar y encontré este fenomenal algoritmo que transforma a JSON desde cualquier XML (no sólo RSS y Atom, como hace la API de Google Gadgets)... pero, ¡tampoco funcionaba bien con Namespaces!

Así que me tuve que poner manos a la obra, cambiando un poco el código original. El problema estaba en que el algoritmo original no reconocía bien los dos puntos ":", usados en los namespaces. Mi aportación consiste simplemente en eliminar los namespaces del XML, antes de pasarlo a JSON.

Este es el código añadido del que os hablo:

    delete_namespace: function(x){
        var indexNamespace = x.indexOf('%3a');
        if (indexNamespace>-1)
        {
            x = x.substr(indexNamespace + '%3a'.length);
        }
        return x;
    }


Donde '%3a' son los dos puntos ':'.

Como véis, en lugar de borrar el namespace,
se puede modificar al gusto, cambiándolo, por ejemplo, por un guión bajo.

Bajaos el archivo adjunto con el algoritmo, de modo que usarlo es tan simple como esto:

    myJsonObject=xml2json.parser(XmlText);


Donde XmlText es el texto en XML.

Espero que os sea de utilidad, pero recordad que todo el mérito es del código original de Thomas Frank.