2011-11-23 19 views
17

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

+1

Cosa c'è di sbagliato nell'uso di jQuery? (rende le cose molto più semplici) – Nathan

+0

Perché non provi jQuery? – Raptor

+3

Spiacente .. Devo usare solo Java Script in questa attività. –

risposta

35

(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).

10

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

0

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

+0

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

+0

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

+0

@NathanSri Quel primo collegamento è morto, puoi aggiornare la tua risposta? – Hugo