2011-02-01 2 views
0

Как подсчитать количество листовых узлов, исходящих от определенного узла XML, используя jQuery? Соответствующий XML выглядит примерно так. Я хочу, чтобы все листовые узлы сошли с узла <Errors>.jQuery XML: количество числовых узлов

<Errors> 
    <ErrorParentCat> 
     <ErrorTag/> 
     <ErrorTag2/> 
    </ErrorParentCat> 
</Errors> 

В этом примере я хочу <ErrorTag/> и <ErrorTag2/> Обновляется. Следовательно, результатом должно быть 2. Также <ErrorParentCat> является примером тега, может быть много в пределах <Errors> с разными именами.

Как только у меня есть номер, я бы хотел, чтобы список этих листовых узлов тоже был, если это возможно.

ответ

3

Предполагая, что у вас уже есть XMLDocument имени xml:

var $xml = $(xml), 
    count = $xml.find('*').filter(function() 
    { 
     return $(this).children().length === 0; 
    }).length; 
console.log(count); 

Вы также можете просто передать строку XML непосредственно в функции JQuery:

var $xml = $('<Errors><ErrorParentCat><ErrorTag/><ErrorTag2/></ErrorParentCat></Errors>'); 
// the rest is the same 

jsfiddle demo →


Редактировать Вы сказали, что хотите список этих листовых узлов. В приведенном выше коде, вы уже получили их:

var $xml = /* whatever */, 
    $leafNodes = $xml.find('*').filter(function() 
    { 
     return $(this).children().length === 0; 
    }), 
    count = $leafNodes.length; 

Edit # 2, как Тим вниз указал (см комментарии ниже), вы не можете просто передать строку XML в $() в IE (! @ # $ IE). Вы должны использовать 1.5 функции JQuery $.parseXML() разобрать произвольную хорошо сформированную строку XML в XMLDocument:

var xmlDoc = $.parseXML('<Errors><ErrorParentCat><ErrorTag/><ErrorTag2/></ErrorParentCat></Errors>'), 
    $xml = $(xmlDoc); 
/* the rest is unchanged */ 

new jsfiddle demo →

+0

Это лучше, +1 –

+0

Приветствия за ответ, я сам изменил код перед тем, как увидел ваше обновление :) – Chris

+0

@ Крис: Я полагал, что это не было за пределами вас, но я стараюсь отвечать как можно яснее. Пожалуйста. –

1

Грузы способов сделать это:

var countThem = 0; 

    jQuery.ajax({ 
     type: "GET", 
     url: 'blahblah.xml', 
     dataType: ($.browser.msie) ? "text/xml" : "xml", 
     success: function(xml) { 
      var xml2 = load_xml(xml); 
      $(xml2).find('Errors').each(function(){ 
       $(xml2).find('ErrorParentCat').each(function(){ 
        alert($(this).text()); //alert the contents 
        countThem++; 
       }); 
      }); 
      alert(countThem); //alert the total number 
     } 
    }); 

и XML функция загрузки:

function load_xml(msg) { 
    if (typeof msg == 'string') { 
     if (window.DOMParser)//Firefox 
      { 
      parser=new DOMParser(); 
      data=parser.parseFromString(text,"text/xml"); 
     }else{ // Internet Explorer 
      data=new ActiveXObject("Microsoft.XMLDOM"); 
      data.async="false"; 
      data.loadXML(msg); 
     } 
    } else { 
     data = msg; 
    } 
    return data; 
} 
+0

Спасибо, но я должен был указать, что 'ErrorParentCat' был примером, может быть много – Chris

+0

oh ... Игнорируйте мой ответ тогда ... –

+0

Спасибо, хотя его приятно, кроме этого немного :) – Chris

Смежные вопросы