2011-01-11 14 views
5

Sto codificando un lettore RSS in Javascript utilizzando XMLHttpRequest.Lettura della sezione CDATA XML con]] in esso

Per alcuni feed RSS ho avuto problemi ma in alcuni casi l'attributo xmlDocument.firstChild sempre stato NULL

Dopo aver cercato di vedere le differenze tra l'XML che ha funzionato e quelli che non hanno lavorato ho scoperto che il seguente è la causa dell'errore.

<item> 
    <description> 
     <![CDATA[This is a description for a test [...]]]> 
    </description> 
</item> 

Perché in questa descrizione tag ho una parentesi di chiusura seguito dalle parentesi della CDATA chiusura sta causando il mio errore, ho fatto un codice con C# utilizzando LINQ per lo stesso XML e tutto funzionava.

La parentesi di chiusura che si trova appena prima delle parentesi di chiusura del CDATA causa questo strano comportamento. Come test ho provato a leggere lo stesso XML usando C# e LINQ, tutto ha funzionato bene.

poi ho cercato di aggiungere uno spazio tra le parentesi di chiusura, come la seguente

<![CDATA[This is a description for a test [...] ]]>

e ha funzionato!

mio codice javascript

function LoadRSS() { 
    http_request.onreadystatechange = function() { showContent(http_request); }; 
    http_request.open("GET", "./feeds/test.xml", true); 
    http_request.send(false); 
} 


function showContent(http_request) { 
    if (http_request.readyState == 4) { 
     if (http_request.status == 200) { 
      var parser = new DOMParser(); 
      var xml_doc = parser.parseFromString(http_request.responseText, "text/xml"); 
      alert(xml_doc.firstChild) 
     } 
     else { 
      xml_doc = null; 
     } 
    } 
} 

Qualcuno ha affrontato qualcosa di simile? Ora davvero non so come procedere, qualsiasi commento e suggerimento sono ben accetti.

+1

Questo sembra essere un bug nel parser XML. Quale sistema operativo/browser/versione stai usando? – Phrogz

+0

Il browser si chiama OBIGO, è un browser per cellulari – YasuDevil

+1

Sì, browser spezzato. La sezione CDATA può contenere le combinazioni ']]'; solo pieno ']]>' lo conclude. – StaxMan

risposta

5

Qualsiasi browser utilizzi sembra analizzare le sezioni CDATA in modo errato: solo ]]> segna la fine della sezione, eventuali altre parentesi quadre non dovrebbero influire affatto su questo.

+0

Bene, la sostituzione delle parentesi probabilmente risolverà il mio problema. Proverò a eseguire lo stesso codice in un altro browser per vedere cosa succede. – YasuDevil

+1

La prima parte è giusta, la seconda è sbagliata: sì, è possibile includere entità, ma NON verranno analizzate ma incluse esattamente come sono. Quindi non puoi usare le entità per citare nulla. – StaxMan

+1

@StaxMan: Spiacente, ho interpretato male quella sezione - è solo per i valori degli attributi, non per le sezioni CDATA generiche. @YasuDevil: Suppongo che la mia soluzione non funzionerà dopo tutto. – casablanca

1

Per quanto riguarda "come procedere" ... perché non includere sempre uno spazio prima della fine del blocco CDATA sempre? Non hai il controllo sull'XML generato? In tal caso, è possibile utilizzare JS per:

var xml = http_request.responseText.replace(/\]\]>/g, ' ]]>'); 
var xml_doc = parser.parseFromString(xml, "text/xml"); 
+0

Sì, questa è una buona soluzione, grazie a tutti – YasuDevil