2010-10-13 6 views
0

J'ai regardé partout, et je ne peux pas trouver une solution propre (que je peux comprendre).Afficher un élément aléatoire d'une liste xml

Comment puis-je tirer une entrée au hasard à partir d'une liste xml?

Mon point de départ est la suivante (qui tire la dernière entrée):

<script type="text/javascript"> 
var xmlDoc=null; 
if (window.ActiveXObject) 
{// code for IE 
    xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); 
} 
if (xmlDoc!=null) 
{ 
    xmlDoc.async=false;xmlDoc.load("/folder/file.xml"); 
    var x=xmlDoc.getElementsByTagName("z:row"); 
    for (i=0;i<1;i++) 
    { 
    document.write(x[i].getElementsByTagName("@ows_Title")[0] 
    .childNodes[0].nodeValue); 
    } 
} 
</script> 

et toutes les suggestions très bien accueillis!

+0

Partout? Vraiment? N'avez-vous pas juste besoin d'un itérateur et d'un générateur de nombres aléatoires? http://www.w3schools.com/jsref/jsref_random.asp – bzlm

+0

Sur tout, oui. Parce que ce générateur de nombres aléatoires aide seulement (autant que possible) si vous a) connaissez le nombre d'éléments que vous avez, et b) si vous les avez listés dans un tableau interne plutôt que dans un fichier externe. Si vous pouvez me dire comment appliquer le peu math.random je serai éternellement reconnaissant! – RedGen

+0

Je m'attendrais 'getElementsbyTagName' à retourner un' NodeList', qui a la propriété 'length' et une méthode' item() 'qui prend un nombre. – andrewmu

Répondre

0

Modifier le code légèrement ... pour passer "pour (i = 0; i < 1; i ++)" avec "var i = Math.floor ((Math.random() * 1000)% x.length) "

<script type="text/javascript"> 
var xmlDoc=null; 
if (window.ActiveXObject) 
{// code for IE 
    xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); 
} 
if (xmlDoc!=null) 
{ 
    xmlDoc.async=false;xmlDoc.load("/folder/file.xml"); 
    var x=xmlDoc.getElementsByTagName("z:row"); 
    var i = Math.floor((Math.random()*1000)%x.length); 
    { 
    document.write(x[i].getElementsByTagName("@ows_Title")[0] 
    .childNodes[0].nodeValue); 
    } 
} 
</script> 

Vive

2

math.random() retourne un nombre compris entre 0 et 1, et getElementsByTagName retourne un NodeList qui a une longueur. Ainsi,

Math.floor(Math.random() * x.length) 

vous donne un index aléatoire dans la liste de nœuds. Vous pouvez ensuite utiliser cet index pour appeler item() afin d'extraire ce noeud de la liste:

var nodeList = xmlDoc.getElementsByTagName("whatever"); 
var node = nodeList.item(Math.floor(Math.random() * nodeList.length)); 
Questions connexes