Announcement

Collapse
No announcement yet.

XML Baum komplett durchlaufen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • XML Baum komplett durchlaufen

    Hallo

    Vielleich hat jemand von euch eine Idee oder Hinweis.

    Ich bekomme einen kompletten XML Baum per AJAX geladen.
    Es sollten alle Element dieses Baumes in einer Schleife abgearbeitet werden.

    Code:
    xmlDoc = daten_quelle_ajax_object.responseXML;
    for(i = 0; i < xmlDoc.childNodes.length; i++)
    {
    ....
    }
    bekomme ich nur die Childs des Wurzelelement nicht mehr - aber nicht dessen Kinder und Kindeskinder usw.

    Ich verwende bewusst kein jQuery.

    Vielen Dank im Voraus

  • #2
    Ich verwende bewusst kein jQuery.
    Das ist ein Fehler....

    Ansonsten ist das ein klassischer TreeWalk. D.h. der Aufruf einer rekursiven Methode die ein Durchsuchung anhand (ab) einem Startparameter vornimmt. Findet die Methode Elemente die ihrerseits zu durchsuchen sind, wird die Methode selbst mit den Element als Parameter aufgerufen
    Christian

    Comment


    • #3
      Danke für den Hinweis:

      Habe jetzt eine rekursive Funktion, welche abcheckt ob es noch ein child/child gibt, leider hängt sich der Browser auf.

      Kannst du mir sagen wie ich es besser/richtig formulieren kann (oder einen Link wo ein js-treewalk für responseXML)?



      Code:
      function treewalk(xmlDoc, myResult)
      {
        var i=0;
        for(i = 0; i < xmlDoc.childNodes.length; i++)
        {
        myResult += xmlDoc.getElementsByTagName("*")[i].firstChild.nodeValue;
        if(xmlDoc.getElementsByTagName("*")[i].firstChild.firstChild){myResult +=treewalk(xmlDoc,myResult)};
        }
      }

      Dank im voraus.

      Comment


      • #4
        Deine Funktion verstehe ich nicht so ganz. Was ist myResult?

        Aufruf der Funktion mit dem "Starttag"
        Es werden die Kinder des übergebenen Tags ermittelt
        Eine Schleife über die ermittelten Kinder
        Das aktuelle Kind wird bearbeitet (in eine Liste aufgenommen oder was du sonst mit machen willst)
        Es wird geprüft, ob das aktuelle Kind seinerseits Kindelemente hat.
        Wenn ja wird die Funktion mit dem aktuellen Kind aufgerufen
        Schleifenende

        oder einen Link wo ein js-treewalk für responseXML
        Würde da google bemühen...allerdings was hat dein "responseXML" damit zu tun? Es ist egal woher das XML kommt. Habe zumindestens gestern ein paar Links gefunden, die man sich näher ansehen könnte
        Christian

        Comment


        • #5
          Sorry etwas schlecht von mir formuliert!

          was hat dein "responseXML" damit zu tun
          es gibt für js die function treewalker...allerdings nur für DOM und nicht XMLHttpRequest (gegoogelt)

          Es wird geprüft, ob das aktuelle Kind seinerseits Kindelemente hat.
          Wenn ja wird die Funktion mit dem aktuellen Kind aufgerufen
          Oje - ich rufe ja nochmals den kompletten Baum auf - mein BUG.

          Code:
          function treewalk(xmlDoc, myResult)
          {
            var i=0;
            for(i = 0; i < xmlDoc.childNodes.length; i++)
            {
            myResult += xmlDoc.getElementsByTagName("*")[i].firstChild.nodeValue;
            if(xmlDoc.getElementsByTagName("*")[i].firstChild.firstChild){myResult +=treewalk(xmlDoc,xmlDoc.getElementsByTagName("*")[i].firstChild.nodeValue)};
            }
          }
          klappt leider auch nicht


          Auf deine Text bezugen:

          Aufruf der Funktion mit dem "Starttag"
          Es werden die Kinder des übergebenen Tags ermittelt
          Eine Schleife über die ermittelten Kinder
          Das aktuelle Kind wird bearbeitet
          Es wird geprüft, ob das aktuelle Kind seinerseits Kindelemente hat.
          --->Wenn ja wird die Funktion mit dem aktuellen Kind aufgerufen
          (hier sollte child/child aufgerufen werden) usw
          Schleifenende

          Comment


          • #6
            es gibt für js die function treewalker...allerdings nur für DOM und nicht XMLHttpRequest (gegoogelt)
            Diese habe ich auch gefunden, aber dazu gibt es bsp. keine Beschreibung bei SELFHTML. Steht diese browserübergreifend zur Verfügung?
            Dachte der kann man XML übergeben. Woher das kommt, also DOM oder Response ist wurscht
            Christian

            Comment


            • #7
              JAEIN erst ab ie9

              Demo
              http://help.dottoro.com/ljngnhum.php

              Comment


              • #8
                (hier sollte child/child aufgerufen werden) usw

                Es wird nur das aktuelle Child übergeben. Die Funktion such sich selber die Kinder
                Christian

                Comment


                • #9
                  Das ist schwieriger als ich dachte.

                  Es ist nicht der Elementenbaum sondern der Knotenbaum.
                  Der Elementknoten hat einen Textknoten (child).
                  Den Inhalt des Textknoten steht dann laut Firebug im value.


                  Code:
                  <container>
                    <node id="4711">Text 4711</node>
                    <node id="4712">12.123456</node>
                  </container>
                  meine XML Quelle


                  Code:
                  function treewalk(xmlDoc, myResult)
                  {
                    var i=0;
                    for(i = 0; i < xmlDoc.childNodes.length; i++)
                    {
                    nodevalue= xmlDoc.getElementsByTagName("*")[i].value;
                    SubXmlDoc=xmlDoc.getElementsByTagName("*")[i].firstChild.firstChild;
                    if(SubXmlDoc){
                      myResult +=treewalk(SubXmlDoc,myResult)};
                    }
                  }
                  klappt auch noch nicht. Hast du noch einen Tipp für mich?

                  myResult habe erstmal nicht berücksichtigt - nodevalue liefert nicht.

                  Comment


                  • #10
                    Ich weiss nicht, was du mit dem Value des Nodes willst. M.E. ist
                    .firstChild.firstChild; nicht ok
                    Christian

                    Comment


                    • #11
                      Hallo Christian!

                      Fast habe ich es.
                      Leider gibts noch ein Problem.
                      Für XML-Bäume beliebiger Tiefe.

                      ok Funktion wird XML-Doc übergeben
                      ok Arbeite obersten Knoten ab
                      ok Sucht nach childs
                      ok Ruft sich selber mit den aktuellen Child auf
                      no Arbeite 1 Child ab - Fehlermeldung


                      Code:
                      function treewalk(xml)
                      {
                        if (xml) {
                          var name1 = xml.getElementsByTagName("*")[0].getAttribute("id");
                      	var inhalt1 = xml.getElementsByTagName("*")[0].textContent;
                          var Nodes = xml.getElementsByTagName("*")[0].childNodes;
                          if (Nodes) {
                            for (var i = 0; i < Nodes.length; i++) {
                      	     treewalk(Nodes[i]);
                      
                            }
                          }
                        }
                      }

                      Woran kann es liegen? Danke im voraus

                      Comment

                      Working...
                      X