6
votes

Boucle à travers xml avec jQuery

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 à xxx

a est un article, et un est un dossier .

Son code JQuery, qui ne peut avoir un seul niveau de balises xxx

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.

Toute aide est grandement appréciée!


3 commentaires

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.


5 Réponses :


1
votes

Vous pouvez utiliser

$ (el) .children (). Longueur 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?


1 commentaires

Non, les noms de nœud sont soit ou . Une page peut exister à l'intérieur ou à l'extérieur d'un livre. Un livre peut contenir d'autres livres ou pages. Dans le XML, j'ai posté ci-dessus, il y a une page qui a 2 parents de livres.



9
votes

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);
});


0 commentaires

1
votes

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"));
});


1 commentaires

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.



0
votes

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: -) XXX


0 commentaires

1
votes

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 xxx


0 commentaires