2009-07-21 17 views
6

Rozważmy następujący problem:Policzyć liczbę węzłów w urywek XML przy użyciu JavaScript/E4X

użyciu JavaScript/E4X, w scenariuszu użytkowania non-browser (silnika integracja JavaScript HL7), istnieje zmienna trzyma Fragment XML, który może mieć wiele powtarzających się węzłów.

<pets>  
<pet type="dog">Barney</pet> 
<pet type="cat">Socks</pet> 
</pets> 

Pytanie: Jak uzyskać zliczania liczby węzłów domowych w JavaScript/E4X?

EDYCJA: Aby wyjaśnić, to pytanie powinno być około E4X (ECMAScript for XML). Przepraszam tych, którzy odpowiedzieli bez tej informacji. Powinienem był wcześniej zbadać, &, tę informację.

+0

Czy masz przynajmniej dostęp do DOM API? –

Odpowiedz

5

Użyj obiektu XML E4X do zbudowania obiektu XMLList dla węzłów "domowych". Następnie możesz wywołać metodę length na XMLList.

//<pets> 
// <pet type="dog">Barney</pet> 
// <pet type="cat">Socks</pet> 
//</pets> 

// initialized to some XML resembling your example 
var petsXML = new XML(""); 

// build XMLList 
var petList = petsXML['pet']; 

// alternative syntax 
// var petList = petsXML.pet; 

// how many pet nodes are under a given pets node? 
var length = petList.length(); 
+0

Nie możesz po prostu zrobić: petsXML.pet.length(); –

+0

Absolutnie, a właściwie normalnie to robię! Właśnie chciałem rozdzielić rzeczy, aby wyjaśnić, że .pet (lub ['pet']) zwraca i obiekt XMLList, a ta długość() jest wywołaniem metody tego typu. – csj

3

Powiedziałbym ... użyj jQuery!

var count = 0; 
    $(xmlDoc).find("pet").each(function() { 
      count++; 

      // do stuff with attributes here if necessary. 
      // var pet = $(this); 
      // var myPetType = pet.attr("type"); 
     }; 
    }); 

EDIT:. Nie można używać jQuery ... ok, zróbmy to w regularnych javascript :(

 var pets= xmlDoc.getElementsByTagName("pet"); 
     for (var i = 0; i < pets.length ; i++) 
     { 
      count++; 
     // var petObj = { 
     //  pets[i].getAttribute("type") 
     // }; 
     } 
+0

Nice. Jednak '$' nie jest przeznaczone dla arbitralnych łańcuchów xml, jest przeznaczone dla html. Działa to przez przypadek w tym konkretnym przypadku. Gwarantowana praca to '$ (xmlDoc)' (tzn. Dokument DOM reprezentujący 'xmlstring'). –

+0

Świetna odpowiedź! Niestety JQuery nie jest dostępny dla mnie, ponieważ JS nie znajduje się w przeglądarce lub może odwoływać się do zewnętrznych bibliotek. Ta odpowiedź i tak otrzyma awans! –

+0

100% poprawne. find() działa na elementach, a nie na tekście, co nie jest zbyt jasne w stosunku do mojej nazwy zmiennej. Sądzę, że powinienem zrobić wyraźniejszy ... dobry telefon. – womp

3

Korzystanie DOM można nazwać getElementsByTagName()

alert(document.getElementsByTagName("pet").length); 

Więcej informacje:

https://developer.mozilla.org/en/DOM:element.getElementsByTagName

Musisz jakoś zdobyć dokument XML. XHR na przykład zwraca dokumenty jako sparsowany XML.

var xhr = new XMLHttpRequest(); 
xhr.open('GET', 'http://domain.com/pets.xml', true); 
xhr.onreadystatechange = function (e) { 
    if (xhr.readyState == 4 && xhr.status == 200) 
     alert(xhr.responseXML.getElementsByTagName("pet").length); 
}; 
xhr.send(null); 
+1

Zapisałeś moją godzinę, dziękuję +1 –

Powiązane problemy