Чтение раздела XML CDATA с]] в нем - PullRequest
5 голосов
/ 11 января 2011

Я пишу RSS-ридер в Javascript, используя XMLHttpRequest.

Для некоторых RSS-каналов у меня не было проблем, но в некоторых случаях атрибут xmlDocument.firstChild всегда был NULL

Пытаясь увидеть различия между работающим XML и неработающим, я обнаружил, что причиной ошибки является следующее.

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

Поскольку в этом теге описания у меня есть закрывающая скобка, после которой закрывающие скобки CDATA вызывают мою ошибку, я создал код на C # с использованием LINQ для того же XML, и все работало.

Закрывающая скобка, которая находится перед закрывающими скобками CDATA, вызывает это странное поведение. В качестве теста я пытался читать тот же XML с использованием C # и LINQ, все работало хорошо.

Затем я попытался добавить пробел между закрывающими скобками, как показано ниже

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

И это сработало!

мой код 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;
        }
    }
}

Кто-нибудь сталкивался с чем-то подобным? Теперь я действительно не знаю, как поступить, любые комментарии и предложения приветствуются.

Ответы [ 2 ]

5 голосов
/ 11 января 2011

Какой бы браузер вы ни использовали, он, похоже, неправильно анализирует разделы CDATA - только ]]> отмечает конец раздела, любые другие квадратные скобки не должны влиять на это вообще.

1 голос
/ 11 января 2011

Что касается "как поступить" ... почему бы просто не всегда включать пробел перед концом блока CDATA? У вас нет контроля над сгенерированным XML? Если это так, вы можете использовать JS для:

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