J'ai du code de base qui peut boucler à travers des XML générés à partir d'Adobe Robohelp (pour notre documentation d'aide). Cela fonctionne bien, mais puisqu'un sujet pourrait être imbriqué autant de temps que l'écrivain le souhaite, j'ai besoin d'une meilleure façon de boucler à travers ce XML plutôt que de la nidification de Voici ce que le XML ressemble à p> a Son code JQuery, qui ne peut avoir un seul niveau de balises p> Je sais qu'il y a un meilleur moyen de simplement boucler à travers tous les éléments et puis déterminez si l'élément a des enfants, etc. Mais je ne peux tout simplement pas penser à la façon de le faire. P> Toute aide est grandement appréciée! P> P> ., Code>.
5 Réponses :
Vous pouvez utiliser p>
$ (el) .children (). Longueur code> qui retournerait "0" ou un nombre positif, puis en boucle si c'est un nombre positif qui s'évalue à vrai. Vous pouvez également utiliser une boucle de temps pour le faire de manière récursive et ré-régler le gestionnaire de référence, mais je ne suis pas tout à fait sûr que cela fonctionnerait car vos noms de nodation pour chaque enfant subséquent diffèrent (ou sont-ils? Quoi de neuf Exemple que vous pouvez fournir? p>
Non, les noms de nœud sont soit
Les fonctions récursives fonctionnent bien pour cela. Lorsque vous créez une fonction crée et utilise une fermeture récursive interne, vous pouvez tout terminer dans un petit paquet net:
$.get(tocURL, function(toc) { function makeToc($xml) { // variable to accumulate markup var markup = ""; // worker function local to makeToc function processXml() { markup += "<li><a href='" + $(this).attr("url") + "'>" + $(this).attr("title") + "</a>"; if (this.nodeName == "BOOK") { markup += "<ul>"; // recurse on book children $(this).find("page").each(processXml); markup += "</ul>"; } markup += "</li>"; } // call worker function on all children $xml.children().each(processXml); return markup; } var tocOutput = makeToc($(toc)); $("#list").html(tocOutput); });
Merci beaucoup Keith, c'était le billet - bien presque, je devais faire un changement mineur, puis cela fonctionnait parfaitement!
Mon code est ci-dessous. P>
$tocOutput=""; $.get(tocURL,function(toc){ function makeToc($xml) { // worker function local to makeToc function processXml() { console.log($(this)); $tocOutput += "<li><a href='" + $(this).attr("url") + "'>" + $(this).attr("title") + "</a>"; if (this.nodeName == "BOOK") { $tocOutput += "<ul>"; // recurse on book children $(this).children().each(processXml); $tocOutput += "</ul>"; } $tocOutput += "</li>"; } // call worker function on all children $xml.children().each(processXml); } var tocOutput = makeToc($(toc)); $("#toc").html($tocOutput); completed($("#toc")); });
Vous pouvez me remercier en acceptant ma réponse! Incidemment, mon objectif n'était pas de résoudre tout votre problème, juste pour dupliquer la logique de votre question. En outre, j'ai placé la déclaration variable à l'intérieur de Maketoc () comme une meilleure pratique générale. Ce faisant, cela indique clairement que la variable n'est que pour l'utilisation de Maketoc pour accumuler des résultats.
Voici quelque chose à gagner plus de louange. J'ai fait un appel de fonction anonyme et utilisé les arguments.callee à recueil. Je cherchais moi-même cette méthode, ceci et un autre fil à Stackoverflow m'a aidé et je veux le rembourser: -)
Ce lien fournit un bon exemple d'utilisation d'itération via XML
http://anasthecoder.blogspot.in/2012/02 /looping-through-xml-with-jquery.html
Juste curieux - pourquoi cela doit-il être fait sur le client? Pourquoi ne pas appliquer une transformation XSLT sur le serveur et envoyer le HTML? Est la dynamique XML? Le HTML transformé pourrait-il ne pas être mis en cache sur le serveur?
Peu importe, content que vous ayez trouvé une solution - accepte maintenant la réponse de Keith :)
JE REFUSE! C'était juste une preuve de concept pour l'instant ... en fait, je voulais juste impressionner certaines personnes. Ils me douchaient avec des louanges maintenant, alors ça vaut la peine. Finalement, je pense que nous allons faire ce serveur cependant.