Пользователь jQuery для получения вложенных элементов из XML

Я крутлю свои колеса на этом. Как мне получить значения из следующих вложенных элементов из приведенного ниже XML (я также разместил свой код ниже)? Я после значения «descShort», а затем заглавной «Последняя» и заглавной «изменения»:

<indices>
<index>
    <code>DJI</code>
    <exchange>NYSE</exchange>
    <liveness>DELAYED</liveness>
    <indexDesc>
        <desc>Dow Jones Industrials</desc>
        <descAbbrev>DOW JONES</descAbbrev>
        <descShort>DOW JONES</descShort>
        <firstActive></firstActive>
        <lastActive></lastActive>
    </indexDesc>
    <indexQuote>
        <capital>
            <first>11144.57</first>
            <high>11153.79</high>
            <low>10973.92</low>
            <last>11018.66</last>
            <change>-125.9</change>
            <pctChange>-1.1%</pctChange>
        </capital>
        <gross>
            <first>11144.57</first>
            <high>11153.79</high>
            <low>10973.92</low>
            <last>11018.66</last>
            <change>-125.9</change>
            <pctChange>-1.1%</pctChange>
        </gross>
        <totalEvents>4</totalEvents>
        <lastChanged>16-Apr-2010 16:03:00</lastChanged>
    </indexQuote>
</index>
<index>
    <code>XAO</code>
    <exchange>ASX</exchange>
    <liveness>DELAYED</liveness>
    <indexDesc>
        <desc>ASX All Ordinaries</desc>
        <descAbbrev>All Ordinaries</descAbbrev>
        <descShort>ALL ORDS</descShort>
        <firstActive>06-Mar-1970</firstActive>
        <lastActive></lastActive>
    </indexDesc>
    <indexQuote>
        <capital>
            <first>5007.30</first>
            <high>5007.30</high>
            <low>4934.00</low>
            <last>4939.40</last>
            <change>-67.9</change>
            <pctChange>-1.4%</pctChange>
        </capital>
        <gross>
            <first>5007.30</first>
            <high>5007.30</high>
            <low>4934.00</low>
            <last>4939.40</last>
            <change>-67.9</change>
            <pctChange>-1.4%</pctChange>
        </gross>
        <totalEvents>997</totalEvents>
        <lastChanged>19-Apr-2010 17:02:54</lastChanged>
    </indexQuote>
</index>

$.ajax({
            type: "GET",
            url: "stockindices.xml",
            dataType: "xml",
            success: function(xml) {
                $(xml).find('index').each(function(){

                    var self = $(this);                     
                    var code = self.find('indexDesc');

                    $(code).find('indexDesc').each(function(){
                        alert(self.find('descShort').text());
                    });                     

                    $('<span class=\"tickerItem\"></span>').html(values[0].text()).appendTo('#marq');                                                                   
                });
            }
        });

person Dkong    schedule 20.04.2010    source источник
comment
Призрачный избиратель снова наносит удар   -  person James Westgate    schedule 20.04.2010
comment
Вчера он задал (почти) тот же вопрос: stackoverflow.com/questions/2669556/   -  person Matt    schedule 20.04.2010
comment
Извините. я не мог отредактировать заголовок в предыдущем вопросе. а я не он :)   -  person Dkong    schedule 20.04.2010


Ответы (2)


У вас есть некоторые недостатки в вашей функции. Это должно сделать это:

success: function(xml) {
    $(xml).find('index').each(function(){

        var value = $(this).find('indexDesc descShort').text();
        value += ' ' + $(this).find('indexQuote capital last').text();
        value += ' ' + $(this).find('indexQuote capital change').text();

        $('<span class="tickerItem"></span>').text(value).appendTo('#marq');
    });
}

Два комментария к вашему коду:

var code = self.find('indexDesc');

$(code).find('indexDesc').each(function(){
       alert(self.find('descShort').text());
}); 

Здесь вы присваиваете элемент indexDesc переменной code, а позже пытаетесь найти элемент indexDesc внутри indexDesc (которого не существует).

$('<span class=\"tickerItem\"></span>').html(values[0].text())

Мне действительно интересно, откуда берется values, он никогда не объявляется. И вам не нужно избегать двойных кавычек в одинарных кавычках.


Я настоятельно рекомендую прочитать документацию и tutorial, чтобы познакомиться с основами jQuery.

person Felix Kling    schedule 20.04.2010
comment
Привет Феликс. Спасибо за ваше понимание. Очень признателен. - person Dkong; 20.04.2010
comment
Феликс, я только что проверил это и заметил, что часть, которая извлекает «indexDesc descShort», по какой-то причине возвращается пустой. Очень странный. - person Dkong; 20.04.2010
comment
@Dkong: Ммм, я не знаю. Судя по XML-документу, который вы показываете, он должен работать. - person Felix Kling; 20.04.2010

success: function(xml) {
  $(xml).find('index indexDesc descShort').each(function(){                    

    $('<span class=\"tickerItem\"></span>').html($(this).text()).appendTo('#marq');                                                                   
  });
}

Второй запрошенный пример (это наиболее читаемый, возможна некоторая оптимизация)

success: function(xml) {
  $(xml).find('index').each(function(){                    

    var desc = $('indexDesc descShort', this).text();
    var last = $('indexQuote capital last', this).text();
    var change = $('indexQuote capital change', this).text();

    //Do whatever with the text values                                                                  
  });
}
person James Westgate    schedule 20.04.2010
comment
Привет спасибо. Я также надеялся получить значение для: 'index indexQuote Capital last'. Могу ли я сделать это как-то так, чтобы все это было сделано за одну итерацию вместе со значением descShort, которое вы мне предоставили? - person Dkong; 20.04.2010
comment
спасибо Джеймс. По какой-то причине (используя приведенный выше код и XML, и даже после двойной проверки) текст indexDesc descShort возвращается пустым (определенно без опечаток). Биззаро - person Dkong; 20.04.2010
comment
Я не вижу закрывающий тег ‹/indices› в xml, который вы вставили - person James Westgate; 20.04.2010
comment
Привет, Джеймс, хорошо подмечено, да, это должно быть там, но даже если это так, эта строка все равно ничего не читает: var desc = $('indexDesc descShort', this).text(); очень странный - person Dkong; 20.04.2010
comment
Происходит что-то еще, поскольку оба образца кода выдают одну и ту же ошибку. - person James Westgate; 21.04.2010