Странная проблема с jQuery XML - PullRequest
2 голосов
/ 06 ноября 2010

У меня есть список цитат в документе XML.Каждая цитата обернута так:

<Item>
    <Quote>This is a quote!</Quote>
    <Source>-- this is the Source of the Quote!</Source>
</Item>

Вот jQuery:

    var html = '';
    var tmpl = '<li class=""><p class="quote">__quote</p><p class="source">__source</p></li>';

    $(quoteObj).find('Item').each(function(){ 

        $that = $(this);

        var _quote = $that.children('Quote').text();
        var _source = $that.children('Source').text();

        var qhtml = tmpl.replace('__quote', _quote).replace('__source', _source);

        html += qhtml;

    });

   return html;

В конечном продукте все QUOTES есть, а SOURCES нет,Я не могу на всю жизнь понять, почему.Что прямо передо мной, что я не вижу?

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ К ОТВЕТАМ. КОММЕНТАРИИ:

  1. XML сформирован правильно, и я изменил его выше.
  2. Я добавил строку var tmpl, чтобы показать, что я заменяю в цикле.__quote заменяется, и по крайней мере __source выполняется, так как второй <p> пуст вместо того, чтобы содержать строку.
  3. Я проверил фактический XML, возвращающийся извызов AJAX, и это все там, как и должно быть.

Мне кажется, это какая-то проблема с областью видимости и this, или с действием .children()метод, но я до сих пор не могу его найти.

ONE LAST NOTE:

Изменен регистр тега XML на Initial Caps, который находится в рассматриваемом документе.

Ответы [ 2 ]

3 голосов
/ 13 ноября 2010

jQuery не анализирует XML.Передача строки XML в $() просто назначает строку как свойство innerHTML элемента, который имеет переменные и непредсказуемые результаты.Вам нужно проанализировать XML самостоятельно, используя встроенный в браузер синтаксический анализатор XML, а затем передать полученный документ в jQuery:

var parseXml;

if (window.DOMParser) {
    parseXml = function(xmlStr) {
       return ( new window.DOMParser() ).parseFromString(xmlStr, "text/xml");
    };
} else if (typeof window.ActiveXObject != "undefined" && new window.ActiveXObject("Microsoft.XMLDOM")) {
    parseXml = function(xmlStr) {
        var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = "false";
        xmlDoc.loadXML(xmlStr);
        return xmlDoc;
    };
} else {
    parseXml = function() { return null; }
}


var xmlStr = "<Item><Quote>This is a quote!</Quote><Source>-- this is the Source of the Quote!</Source></Item>";

var xmlDoc = parseXml(xmlStr);
$xml = $(xmlDoc);

$xml.find('Item').each(function() {
    // Do stuff with each item here
    alert("Item");
});
1 голос
/ 08 ноября 2010

Только что попробовал это, и единственное, что мне пришлось изменить, это строка find, соответствующая случаю узла XML, например,

$(quoteObj).find('ITEM').each( function() {

Я также изменил строку назначения $that, включив в нее ключевое слово var, но оно работало до того, как я это сделал

var $that = $(this);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...