2011-01-11 17 views
5

Kodowanie czytnika RSS w JavaScript za pomocą XMLHttpRequest.Czytanie sekcji XML CDATA z]] w niej

Dla niektórych RSS nie miałem żadnych problemów, ale w niektórych przypadkach atrybut xmlDocument.firstChild był zawsze NULL

Po wypróbowaniu zobaczyć różnice między XML, który pracował i tych, które nie pracowały okazało się, że po jest przyczyną błędu.

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

Bo w tym opisie tagu mam nawias zamykający następnie nawiasach zamykających CDATA jest przyczyną mojego błędu Zrobiłem kodu z C# z wykorzystaniem LINQ dla samego XML i wszystko działało.

Klamra zamykająca, która znajduje się tuż przed nawiasami zamykającymi CDATA, powoduje to dziwne zachowanie. Jako test próbowałem przeczytać ten sam XML przy użyciu C# i LINQ, wszystko działało dobrze.

Potem próbowałem dodać odstęp pomiędzy wspornikami zamykających, jak na poniższym

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

I udało się!

mój kod 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; 
     } 
    } 
} 

czy ktoś ma coś podobnego do czynienia? Teraz naprawdę nie wiem jak postępować wszelkie komentarze i sugestie są mile widziane.

+1

Wygląda na to, że jest to błąd w analizatorze składni XML. Z jakiego systemu operacyjnego/przeglądarki/wersji korzystasz? – Phrogz

+0

Przeglądarka nazywa się OBIGO, jest przeglądarką dla telefonów komórkowych – YasuDevil

+1

Tak, uszkodzona przeglądarka. Sekcja CDATA może zawierać kombinacje "]]"; tylko pełne "]]>" kończy to. – StaxMan

Odpowiedz

5

Bez względu na to, jakiej przeglądarki używasz, wydaje się, że sekcja CDATA jest niewłaściwie analizowana - tylko koniec linii jest oznaczony jako ]]>, a pozostałe nawiasy kwadratowe nie powinny mieć na to wpływu.

+0

Dobrze, zamienię nawiasy klamrowe, naprawię mój problem. Spróbuję uruchomić ten sam kod w innej przeglądarce, aby zobaczyć, co się stanie. – YasuDevil

+1

Pierwsza część jest poprawna, druga zła - tak, można dołączyć encje, ale nie, NIE będą one przetwarzane, ale będą dokładnie takie, jakimi są. Więc nie możesz używać obiektów do cytowania czegokolwiek. – StaxMan

+1

@StaxMan: Przepraszam, źle zinterpretowałem tę sekcję - dotyczy to tylko wartości atrybutów, a nie ogólnych sekcji CDATA. @ YasuDevil: Domyślam się, że moje rozwiązanie nie będzie działać. – casablanca

1

Jeśli chodzi o "jak postępować" ... dlaczego nie wystarczy podać spację przed końcem bloku CDATA? Czy nie masz kontroli nad wygenerowanym XML? Jeśli tak, możesz użyć JS do:

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

Tak, to jest dobre rozwiązanie, dziękuję wszystkim – YasuDevil