jermaine: Über Javascript/DOM, mithilfe der Mediawiki-API XML-Tag auslesen

Guten Abend,

für Eure Hilfe wäre ich sehr dankbar. Über Javascript, DOM und samt Hilfe der Mediawiki-API möchte ich auf Daten/Artikel eines Wikis zugreifen, welches überdies auf derselben Domain liegt, ich habe das Wiki selbst installiert. Die Daten sollen in ein <div>-Container geschrieben werden, den ich über eine ID eindeutig benannt habe. Der Container bleibt nach Auslesen (und erfolgreicher Verbindung zum Server) aber leider leer.

Hier der javascript-Code:

  
// function hs(id) ist nur eine Hilfsfunktion  
function hs(id)  
		{  
    	return document.getElementById(id);  
		}  
		  
function getHttpRequest()  
	{  
    var xmlhttp = null;  
    // Mozilla  
    if (window.XMLHttpRequest)  
    	{  
        xmlhttp = new XMLHttpRequest();  
    	}  
    // IE  
    else if (window.ActiveXObject)  
    	{  
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");  
    	}  
    xmlhttp.open('GET', 'mediawiki/mediawiki-1.16.0/api.php?' +  
    				 'action=query&' +  
    				 'prop=revisions&' +  
    				 'titles=LernBar&' +  
    				 'rvlimit=5&' +  
    				 'rvprop=timestamp|user|comment&' +  
    				 'format=xml', true);  
    // Wenn sich der Status ändert, wird die Funktion ausgeführt...  
    xmlhttp.onreadystatechange = function()  
    		{  
        if(xmlhttp.readyState == 4 && xmlhttp.status == 200)  
        	{  
            alert("Status 4 - Antwort des Servers wurde erhalten");  
        	//Bis hierhin klappt es;  
        	var hstest = hs('ergebnis');  
        	var dom_baum = xmlhttp.responseXML;  
			var testvariable = dom_baum.getElementsByTagName('revisions');  
			hstest.innerHTML = testvariable[0].firstChild.nodeValue;  
        	}  
    	}  
    	xmlhttp.send(null);  
}  

Um zu testen, ob überhaupt etwas passiert, habe ich mal per

  
alert(testvariable);

sehen wollen, was passiert. Das Fenster gibt dann [object NodeList] aus. Dies als zusätzliche Info.

Wer kann mir erklären, was ich falsch mache?
Vorab möchte ich erklären, dass ich recht frisch dabei bin, was Programmierung angeht und ich mich sehr reinknie, aber hier mit meinem Latein trotz sehr langer Recherche am Ende bin.

Als zusätzliche Info sei folgendes gesagt: Lade ich in dasselbe Verzeichnis des Servers eine aus dem Mediawiki exportierte (echte) .xml-Datei hoch, kann ich problemlos mit derselben Methode auf diverse Tags zugreifen. Der API zufolge müsste es eigentlich aber genau so, wie oben angegeben, auch  direkt funktionieren...

Vielen Dank!
jermaine

  1. Hi,

    Der Container bleibt nach Auslesen (und erfolgreicher Verbindung zum Server) aber leider leer.

    Und die JS-Fehlerkonsole bleibt auch stumm?

      	var testvariable = dom\_baum.getElementsByTagName('revisions');  
      	hstest.innerHTML = testvariable[0].firstChild.nodeValue;  
    

    Um zu testen, ob überhaupt etwas passiert, habe ich mal per

    alert(testvariable);

    
    > sehen wollen, was passiert. Das Fenster gibt dann [object NodeList] aus.  
      
    Und das firstChild des ersten Elements aus dieser NodeList ist was?  
    (Überprüft, nicht angenommen.)  
      
    MfG ChrisB  
      
    
    -- 
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    
    1. Hi,

      ja der Debugger bleibt stumm.

      Lasse ich mir XML über responseText auslesen, erscheint folgendes

      <?xml version="1.0"?>  
      <api>  
        <query>  
          <pages>  
            <page pageid="2" ns="0" title="LernBar">  
              <revisions>  
                <rev user="testuser" timestamp="2010-09-27T21:39:22Z" />  
                <rev user="testuser" timestamp="2010-09-15T17:29:20Z" />  
                <rev user="testuser" timestamp="2010-09-15T17:28:37Z" />  
              </revisions>  
            </page>  
          </pages>  
        </query>  
      </api>  
      
      

      Gruß
      jermaine

      1. Hallo jermaine,

        <?xml version="1.0"?>

        <api>
          <query>
            <pages>
              <page pageid="2" ns="0" title="LernBar">
                <revisions>
                  <rev user="testuser" timestamp="2010-09-27T21:39:22Z" />
                  <rev user="testuser" timestamp="2010-09-15T17:29:20Z" />
                  <rev user="testuser" timestamp="2010-09-15T17:28:37Z" />
                </revisions>
              </page>
            </pages>
          </query>
        </api>

          
        ich würde mich hier nicht darauf verlassen, das der erste <rev ...> auch wirklich als erstes Kind angesehen wird und nicht der Zeilenumbruch davor. Ich würde hier über  
          
          `dom_baum.getElementsByTagName('revisions')[0].getElementsByTagName('rev')[0].nodevalue`{:.language-javascript}  
          
        gehen  
          
        Gruß, Jürgen  
        
        
        1. Hallo jermaine,

          ich würde mich hier nicht darauf verlassen, das der erste <rev ...> auch wirklich als erstes Kind angesehen wird und nicht der Zeilenumbruch davor. Ich würde hier über

          dom_baum.getElementsByTagName('revisions')[0].getElementsByTagName('rev')[0].nodevalue

          gehen

          Gruß, Jürgen

          Hallo Jürgen,

          vielen Dank.

          Ich habe nun folgendes abgeändert:

          var hstest = hs('ergebnis');  
                          var dom_baum = xmlhttp.responseXML;  
                                  var testvariable = dom_baum.getElementsByTagName('revisions')[0].getElementsByTagName('rev')[0].nodevalue;  
                                  hstest.innerHTML = testvariable;  
          
          

          Im div-Container erscheint nun "undefined". Fällt Dir noch etwas ein?

          Danke und Gruß
          jermaine

          1. Hallo jermaine,

            var testvariable = dom_baum.getElementsByTagName('revisions')[0].getElementsByTagName('rev')[0].nodevalue;

            versuch es mal mit

            dom_baum.getElementsByTagName('revisions')[0].getElementsByTagName('rev')[0].firstChild.nodevalue;

            oder

            dom_baum.getElementsByTagName('revisions')[0].getElementsByTagName('rev')[0].firstChild.data;

            Knoten enthalten keine Daten, sondern "Datenknoten", die dann die Daten enthalten.

            Gruß, Jürgen

            1. Hallo jermaine,

              versuch es mal mit

              dom_baum.getElementsByTagName('revisions')[0].getElementsByTagName('rev')[0].firstChild.nodevalue;

              oder

              dom_baum.getElementsByTagName('revisions')[0].getElementsByTagName('rev')[0].firstChild.data;

              Hallo Jürgen,

              abermals Danke für Deine Hilfe. Beide Varianten liefern jedoch jeweils die Fehlermeldung:

              TypeError: Result of expression 'dom_baum.getElementsByTagName('revisions')[0].getElementsByTagName('rev')[0].firstChild' [null] is not an object.

              Noch Ideen?
              Danke und Gruß
              jermaine

              1. Hallo jermaine,

                Noch Ideen?

                nur noch diesen Link mit dem Beispiel am Ende:
                https://developer.mozilla.org/en/AJAX/Getting_Started

                Gruß, Jürgen

                1. Hallo Jürgen,

                  auch an Dich ein großes Dankeschön für Deine Hilfe. Der Hinweis ".data" war sehr wichtig und auch das "weiterverschachtelnde" Denken hat sehr weitergeholfen.

                  Das Ergebnis erhalte ich über

                  var testvariable = dom_baum.getElementsByTagName('rev')[0].firstChild.data;  
                  hstest.innerHTML = testvariable;
                  

                  Tausend Dank :)
                  jermaine

      2. Hi,

        wenn dir explizite Rückfragen gestellt werden, dann beantworte diese bitte auch.

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        1. Hallo ChrisB,

          Hi,

          wenn dir explizite Rückfragen gestellt werden, dann beantworte diese bitte auch.

          MfG ChrisB

          wenn Du damit Deine Fragen gemeint hast, dann meine ich diese beantwortet mit meinem Folgepost zu haben. Desweiteren bemühe ich mich durchaus um zeitnahes Antworten, was an Werktagen nicht immer möglich ist. Dies sollte man berücksichtigen.

          Gruß
          jermaine

          1. Hi,

            wenn Du damit Deine Fragen gemeint hast, dann meine ich diese beantwortet mit meinem Folgepost zu haben.

            Ich meinte speziell diese hier:

            Und das firstChild des ersten Elements aus dieser NodeList ist was?

            (Überprüft, nicht angenommen.)

            Durch hingeklatschten XML-Code ist das *nicht* beantwortet.

            MfG ChrisB

            --
            RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
            1. Hallo,

              Ich meinte speziell diese hier:

              Und das firstChild des ersten Elements aus dieser NodeList ist was?
              (Überprüft, nicht angenommen.)

              Durch hingeklatschten XML-Code ist das *nicht* beantwortet.

              mit Verlaub, "hingeklatscht" wurde meinerseits wahrlich nicht, das hast Du missgedeutet. Vielmehr will ich durch den XML-Code Ausführlichkeit zeigen.

              Durch die Darstellung des XML-Codes will ich zeigen, dass für den auszulesenden Artikel bisher 3 Kinder des <revisions>-Tag existieren und ich den ersten dieser auslesen möchte.

              Danke für die Hilfe und Gruß,
              jermaine

              1. Hi,

                mit Verlaub, "hingeklatscht" wurde meinerseits wahrlich nicht, das hast Du missgedeutet. Vielmehr will ich durch den XML-Code Ausführlichkeit zeigen.

                Durch die Darstellung des XML-Codes will ich zeigen, dass für den auszulesenden Artikel bisher 3 Kinder des <revisions>-Tag existieren und ich den ersten dieser auslesen möchte.

                Schön, fein, supiklasse - die Rückfrage ist damit aber immer noch nicht beantwortet.

                MfG ChrisB

                --
                RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
                1. Schön, fein, supiklasse - die Rückfrage ist damit aber immer noch nicht beantwortet.

                  MfG ChrisB

                  Hi Chris,

                  ich hoffe, ich verstehe Deinen Frage nun richtig(er): Das firstChild dieser NodeList ist (überprüft) per alert ausgegeben "null".

                  D.h. es existiert kein firstChild oder habe ich das falsch verstanden?

                  Gruß
                  jermaine

                  1. Hi,

                    ich hoffe, ich verstehe Deinen Frage nun richtig(er): Das firstChild dieser NodeList ist (überprüft) per alert ausgegeben "null".

                    D.h. es existiert kein firstChild oder habe ich das falsch verstanden?

                    Die NodeList selber hat kein firstChild.
                    Wenn du auf das erste Element, das die NodeList liefert, zugreifst, dann hat *dieses* vielleicht ein firstChild.
                    Welchen Knoten-Typ dieses dann wiederum hat, solltest du dir als nächstes mal anschauen.

                    MfG ChrisB

                    --
                    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
                    1. Die NodeList selber hat kein firstChild.
                      Wenn du auf das erste Element, das die NodeList liefert, zugreifst, dann hat *dieses* vielleicht ein firstChild.
                      Welchen Knoten-Typ dieses dann wiederum hat, solltest du dir als nächstes mal anschauen.

                      Hi Chris,

                      ich komme der Sache immer näher. Danke, dass Du mich Schritt für Schritt herantasten lässt. Aber noch bin ich nicht am Ziel. Wenn ich über

                      var testvariable = dom_baum.getElementsByTagName('revisions')[0].firstChild.nodeType;

                      gehe, erhalte ich bei Auslesen eine "1". D.h. einen Elementknoten. Ich habe weiter recherchiert und habe mir das Tag dann über .nodeName auslesen lassen. Es ist das gewünschte "rev"-Tag. Aber nodeValue bleibt weiterhin leer. Wie komme ich nun an das Ziel und lasse mir

                      <rev user="testuser" timestamp="2010-09-27T21:39:22Z" />

                      den Text "testuser" und ggf auch den timestamp auslesen? Denn exakt diese Daten benötige ich.

                      Danke und erneute Grüße
                      jermaine

                      1. Ich hab's geschafft !!!

                        var testvariable = dom_baum.getElementsByTagName('rev')[0].firstChild.data;  
                        hstest.innerHTML = testvariable;
                        

                        liefert den gewünschten Output. Ich bin noch lange nicht am Ende von dem, was ich mit dem Auslesen der Daten erreichen möchte, aber das war jetzt schon ein Durchbruch!

                        Tausend Dank für Deine Hilfe, Chris. Zugegebenermaßen, Du hast eine etwas ironisch-gemeine Art zu helfen, aber mir auf diese Art sehr stark geholfen, das Problem mehr oder minder selbstständig zu lösen.

                        Merci und ein schönes Wochenende :)
                        jermaine