2010-11-06 2 views
2

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

<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(), но я до сих пор не могу найти его.

последнее замечание:

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

+2

Не могли бы вы разместить фактический XML? Ваш образец не является корректным (что может быть ответом на ваш вопрос или может быть просто ярлыком, который вы сделали, чтобы показать нам что-то быстро). –

+0

У вас есть значения в xml for Source. он должен быть проверкой прямого доступа, просто нажмите точку перерыва в firebut, вы можете легко проверить это. – kobe

+0

@ hollenback, просто добавьте больше информации, проверьте, получаете ли вы результаты от бэкэнда через панель .net, если вы получаете результаты, затем добавляете точку останова в цикле и проверяете значения. – kobe

ответ

1

Просто попытался это и единственное, что я должен был изменить был find линии, чтобы соответствовать случай узла XML, например

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

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

var $that = $(this); 
+0

Были ли эти изменения? Потому что это не работает с этими изменениями для меня. Не могли бы вы проверить его с помощью jQuery в google и посмотреть, какой результат вы получите? Ссылка на файл jQuery из google: Zabba

+0

Это точно что я использую – Phil

+0

Супер странно. Интересно, почему я могу заставить его работать с вашими изменениями? Постарайтесь опубликовать полный пример? – Zabba

3

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"); 
}); 
Смежные вопросы