Über Javascript/DOM, mithilfe der Mediawiki-API XML-Tag auslesen
jermaine
- javascript
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
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?
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
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
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
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
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
Hallo jermaine,
Noch Ideen?
nur noch diesen Link mit dem Beispiel am Ende:
https://developer.mozilla.org/en/AJAX/Getting_Started
Gruß, Jürgen
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
Hi,
wenn dir explizite Rückfragen gestellt werden, dann beantworte diese bitte auch.
MfG ChrisB
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
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
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
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
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
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
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
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