Ciao voglio analizzare xml/rss da un url live come http://rss.news.yahoo.com/rss/entertainment usando puro Java Script (non jquery). Ho cercato su Google molto. Niente ha funzionato per me. qualcuno può aiutare con un pezzo di codice funzionante.Analisi XML/RSS dall'URL utilizzando Java Script
risposta
(Non si può Googled un sacco.) Una volta che avete worked around the Same Origin Policy, e se la risorsa è servita con un XML MIME type (che it is in this case, text/xml
), è possibile effettuare le seguenti operazioni:
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);
(vedere anche AJAX, e la specifica XMLHttpRequest Level 2 [Working Draft] per altri prop gestore di evento anni.)
In sostanza: Nessuna analisi necessaria. Se si desidera accedere ai dati XML, utilizzare i metodi standard DOM Level 2+ Core o DOM Level 3 XPath, ad es.
/* 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();
(Vedi anche JSX:xpath.js per una comoda, DOM 3 involucro XPath namespace-aware che non utilizza jQuery.)
Tuttavia, se per qualche (sbagliato) ragione il tipo MIME non è un MIME XML digita, o se non è riconosciuto dall'implementazione DOM in quanto tale, puoi utilizzare uno dei parser integrati nei browser recenti per analizzare il valore della proprietà responseText
. Vedere pradeek's answer per una soluzione che funziona in IE/MSXML. Il seguente dovrebbe funzionare ovunque:
var parser = new DOMParser();
var doc = parser.parseFromString(x.responseText, "text/xml");
Procedere come descritto sopra.
Utilizzare i test di funzionalità in fase di esecuzione per determinare il ramo di codice corretto per una determinata implementazione. Il modo più semplice è:
if (typeof DOMParser != "undefined")
{
var parser = new DOMParser();
// …
}
else if (typeof ActiveXObject != "undefined")
{
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
// …
}
Vedi anche DOMParser
e HTML5: DOM Parsing and Serialization (Working Draft).
Un grosso problema che potresti incontrare è che, in genere, non è possibile ottenere dati incrociati. Questo è un grosso problema con la maggior parte dei feed RSS.
Il metodo comune per gestire il caricamento dei dati in javascript tra domini è le chiamate JSONP. Fondamentalmente, questo significa che i dati che stai recuperando sono racchiusi in una funzione di callback javascript. Carichi l'url con un tag script e definisci la funzione nel tuo codice. Quindi, quando lo script viene caricato, esegue la funzione e passa i dati ad esso come argomento.
Il problema con la maggior parte dei feed xml/rss è che i servizi che forniscono solo xml tendono a non fornire funzionalità di wrapping JSONP.
Prima di andare più lontano, verificare se l'origine dati fornisce un formato JSON e la funzionalità JSONP. Ciò renderà questo molto più facile.
Ora, se l'origine dati non corrisponde a fornisce funzionalità json e jsonp, è necessario essere creativi.
Su un modo relativamente semplice per gestire questo è utilizzare un server proxy. Il tuo proxy gira da qualche parte sotto il tuo controllo e agisce da intermediario per ottenere i tuoi dati. Il server carica il tuo xml, e poi il tuo javascript fa le richieste ad esso. Se il server proxy viene eseguito con lo stesso nome di dominio, puoi semplicemente utilizzare le richieste standard xhr (ajax) e non devi preoccuparti delle cose tra domini diversi.
In alternativa, il server proxy può racchiudere i dati in un callback jsonp ed è possibile utilizzare il metodo sopra menzionato.
Se si utilizza jQuery, le richieste xhr e jsonp sono metodi incorporati e quindi rendere molto semplice la codifica. Anche altre librerie js comuni dovrebbero supportarle. Se stai codificando tutto questo da zero, è un po 'più di lavoro ma non terribilmente difficile.
Ora, una volta ottenuti i dati speriamo che sia solo un json. Quindi non c'è bisogno di analisi.
Tuttavia, se si finisce con una versione xml/rss e se si utilizza jQuery, è possibile utilizzare semplicemente jQuery.parseXML http://api.jquery.com/jQuery.parseXML/.
convertire meglio xml in json. http://jsontoxml.utilities-online.info/
dopo la conversione, se avete bisogno di stampare oggetto JSON controllare questo tutorial http://www.w3schools.com/json/json_eval.asp
Conversione di XML per JSON può essere utile sintatticamente (più brevi, migliori funzioni di accesso dello spettacolo) se fatto correttamente - cioè, se i namespace XML sono considerati - ma che è inutile e la struttura dei dati risulta è meno flessibile di un documento XML (JSPath, JSSLT chiunque?). (Sfortunatamente, il tuo primo URI è 404-compatibile.) BTW, W3Schools (che non ha nulla a che fare con il W3C) è un sito pieno di disinformazione, meglio evitato. – PointedEars
Ora che il sito Web è di nuovo online, potrei rivedere il convertitore. Non è davvero male. Namespace e Unicode sono considerati; i nomi degli attributi sono "' -' "-prefixed; i nodi con lo stesso nome sono array-ified; anche gli errori del parser sono serializzati. C'è comunque spazio per miglioramenti. Ad esempio: tutti i valori serializzati sono stringhe; per gli attributi booleani potresti aver risparmiato un po 'di overhead semplicemente con 'true', che fa parte di JSON. E la conversione non è biiettiva (quando potrebbe): toJSON (toXML (json))! = Json. – PointedEars
@NathanSri Quel primo collegamento è morto, puoi aggiornare la tua risposta? – Hugo
Cosa c'è di sbagliato nell'uso di jQuery? (rende le cose molto più semplici) – Nathan
Perché non provi jQuery? – Raptor
Spiacente .. Devo usare solo Java Script in questa attività. –