2011-11-23 35 views
17

Hola quiero analizar xml/rss desde una url en vivo como http://rss.news.yahoo.com/rss/entertainment usando Java Script puro (no jquery). He buscado mucho en Google. Nada funcionó para mí. ¿Alguien puede ayudar con una pieza de código de trabajo?Analizando XML/RSS desde URL usando Java Script

+1

¿Qué hay de malo con el uso de jQuery? (hace las cosas mucho más fáciles) – Nathan

+0

¿Por qué no pruebas jQuery? – Raptor

+3

Lo siento ... Tengo que usar solo Java Script en esta tarea. –

Respuesta

35

(No puede haber buscado en Google un montón.) Una vez que tenga worked around the Same Origin Policy, y si el recurso se sirve con un XML MIME type (que it is in this case, text/xml), puede hacer lo siguiente:

var x = new XMLHttpRequest(); 
x.open("GET", "http://feed.example/", true); 
x.onreadystatechange = function() { 
    if (x.readyState == 4 && x.status == 200) 
    { 
    var doc = x.responseXML; 
    // … 
    } 
}; 
x.send(null); 

(Véase también AJAX, y la especificación de XMLHttpRequest Level 2 [Borrador de Trabajo] para otros prop controlador de eventos erties.)

En esencia: Sin necesidad de análisis. Si luego desea acceder a los datos XML, use los métodos estándar DOM Level 2+ Core o DOM Level 3 XPath, p. Ej.

/* DOM Level 2 Core */ 
var title = doc.getElementsByTagName("channel")[0].getElementsByTagName("title")[0].firstChild.nodeValue; 

/* DOM Level 3 Core */ 
var title = doc.getElementsByTagName("channel")[0].getElementsByTagName("title")[0].textContent; 

/* DOM Level 3 XPath (not using namespaces) */ 
var title = doc.evaluate('//channel/title/text()', doc, null, 0, null).iterateNext(); 

/* DOM Level 3 XPath (using namespaces) */ 
var namespaceResolver = (function() { 
    var prefixMap = { 
    media: "http://search.yahoo.com/mrss/", 
    ynews: "http://news.yahoo.com/rss/" 
    }; 

    return function (prefix) { 
    return prefixMap[prefix] || null; 
    }; 
}()); 

var url = doc.evaluate('//media:content/@url', doc, namespaceResolver, 0, null).iterateNext(); 

(Ver también JSX:xpath.js para una, DOM 3 envoltorio XPath espacio de nombres-conscientes conveniente que no utiliza jQuery.)

Sin embargo, si por alguna razón (mal) el tipo MIME no es un XML MIME escriba, o si la implementación DOM no lo reconoce como tal, puede usar uno de los analizadores integrados en los navegadores recientes para analizar el valor de la propiedad responseText. Consulte pradeek's answer para obtener una solución que funcione en IE/MSXML. Lo siguiente debería funcionar en cualquier otro lugar:

var parser = new DOMParser(); 
var doc = parser.parseFromString(x.responseText, "text/xml"); 

Proceda como se describe arriba.

Utilice pruebas de características en tiempo de ejecución para determinar la rama de código correcta para una implementación determinada. La forma más sencilla es:

if (typeof DOMParser != "undefined") 
{ 
    var parser = new DOMParser(); 
    // … 
} 
else if (typeof ActiveXObject != "undefined") 
{ 
    var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); 
    // … 
} 

Ver también DOMParser y HTML5: DOM Parsing and Serialization (Working Draft).

10

Un gran problema que puede encontrar es que, en general, no puede obtener datos entre dominios. Este es un gran problema con la mayoría de los feeds RSS.

La forma más común de lidiar con la carga de datos en el dominio cruzado javascript es llamar a JSONP. Básicamente, esto significa que los datos que está recuperando están envueltos en una función de devolución de llamada javascript. Cargas la URL con una etiqueta de script y defines la función en tu código. Entonces, cuando se carga el script, ejecuta la función y le pasa los datos como un argumento.

El problema con la mayoría de los feeds xml/rss es que los servicios que solo proporcionan xml tienden a no proporcionar la capacidad de envoltura JSONP.

Antes de ir más lejos, verifique si su fuente de datos proporciona un formato json y la funcionalidad JSONP. Eso hará que esto sea mucho más fácil.

Ahora, si su fuente de datos no proporciona la funcionalidad json y jsonp, debe ser creativo.

En una forma relativamente fácil de manejar esto es utilizar un servidor proxy. Su proxy se ejecuta en algún lugar bajo su control, y actúa como intermediario para obtener sus datos. El servidor carga su xml, y luego su javascript realiza las solicitudes en su lugar. Si el servidor proxy se ejecuta con el mismo nombre de dominio, entonces puede usar las solicitudes estándar xhr (ajax) y no tiene que preocuparse por las cuestiones de dominio cruzado.

Como alternativa, su servidor proxy puede ajustar los datos en una devolución de llamada jsonp y puede utilizar el método mencionado anteriormente.

Si está utilizando jQuery, las solicitudes xhr y jsonp son métodos integrados y hacen que la codificación sea muy sencilla. Otras bibliotecas js comunes también deberían ser compatibles. Si está codificando todo esto desde cero, es un poco más de trabajo pero no terriblemente difícil.

Ahora, una vez que obtenga sus datos con suerte es simplemente json. Entonces no hay análisis necesario.

Sin embargo, si termina teniendo que quedarse con una versión xml/rss, y si es jQuery, simplemente puede usar jQuery.parseXML http://api.jquery.com/jQuery.parseXML/.

0

mejor convierta xml a json. http://jsontoxml.utilities-online.info/

después de la conversión si es necesario imprimir objeto JSON comprobar este tutorial http://www.w3schools.com/json/json_eval.asp

+0

La conversión de XML a JSON puede ser útil sintácticamente (acceso más corto y mejor rendimiento) si se realiza correctamente, es decir, si se consideran espacios de nombres XML, pero eso es innecesario y la estructura de datos resultante es menos flexible que un documento XML (JSPath, JSSLT ¿nadie?). (Desafortunadamente, su primer URI es compatible con 404). Por cierto, W3Schools (que no tiene nada que ver con el W3C) es un sitio lleno de desinformación, es mejor evitarlo. – PointedEars

+0

Ahora que el sitio web está de nuevo en línea, podría revisar el convertidor. Realmente no está mal. Namespaces y Unicode son considerados; los nombres de los atributos son "' -' "-prefixed; los nodos con el mismo nombre están matriculados; incluso los errores del analizador son serializados. Sin embargo, hay margen de mejora. Por ejemplo: todos los valores serializados son cadenas; para los atributos booleanos, podrías haber guardado un poco de sobrecarga simplemente con 'true', que es parte de JSON. Y la conversión no es biyectiva (cuando podría): toJSON (toXML (json))! = Json. – PointedEars

+0

@NathanSri Ese primer enlace está muerto, ¿puedes actualizar tu respuesta? – Hugo