JS + AJAX + XML Problem

Industrial

Grünschnabel
Hallo,

Ich experimentiere gerade ein wenig mit XMLHttpRequest und habe eine kleine Testumgebung geschrieben, bei der ich mir per AJAX Daten vom Server zurückgeben lasse. Das klappt soweit auch ganz gut. Nur wenn ich die Daten als XML zurückgebe und dann versuche die DOM auseinanderzuklamüsern, bekomme ich Probleme.

Ein alert(xmlHttp.responseText) gibt mir die Textversion der Antwort wieder. Ich weiss also, dass die Übertragung klappt. Der Testtext ist:
Code:
<?xml version="1.0" ?>
<root>blabla</root>

Wenn ich jetzt den Wert von Root auslesen möchte, so mache ich das mit:
Code:
alert(xmlHttp.responseXML.getElementsByTagName('root')[0].firstChild.nodeValue)

Und bekomme mein 'blabla'.
Soweit, so gut. Nur sobald ich auch nur ein einziges weiteres Element zu meinem XML hinzufüge, bekomme ich keinerlei Ausgabe mehr, beispielsweise:
Code:
<?xml version="1.0" ?>
<root>blabla</root><fff>ggg</fff>

Ich bin schon am verzweifeln. Ich habe schon diverse Varianten, die man so auf verschiedenen Seiten findet, durchprobiert, aber noch kein Weg gefunden, mehrere Elemente auszugeben (ich test überigens mit Opera 8.5 und Firefox 1.5).

Kennt jemand ein gutes Tutorial oder kann mir anderweitig weiterhelfen?
 
Ursache ist, dass dein XML im 2. Beispiel fehlerhaft ist.

XML-Dokumente dürfen nur 1 Wurzelelement haben, du hast jetzt aber 2.
Wenn du bei XMLHttpRequest die Serverantwort über responseXML holst, muss diese Antwort ein fehlerfreies XML-Dokument sein(im Gegensatz zur Verarbeitung von responseText, wo du dann aber nicht auf die Knotenstruktur zugreifen kannst).

so würde es gehen:
Code:
<?xml version="1.0" ?>
<root>blabla<fff>ggg</fff></root>

Ob dein XML-Dokument korrekt ist, kannst du leicht testen, wenn du es im IE oder Mozilla öffnest...diese haben einen eingebauten XML-Parser, welcher dir im Falle eines Fehlers Selbigen anzeigt ;)
 
Das Problem ist ganz einfach der Aufbau deines XML-Dokuments. So besitzt jedes wohlgeformte XML-Dokument ein zusammenfassendes Wurzelelement, in dem alle anderen Elemente notiert sind. Also etwa:
Code:
<?xml version="1.0" ?>
<root>
	<foo>blabla</foo>
	<bar>ggg</bar>
</root>
 
Ah, ja, das hatte ich vergessen =)

Jetzt komme ich weiter, folgende Testdatei
Code:
<?xml version="1.0" ?>
	<root><fff>test1</fff><ggg>test2</ggg></root>

konnte ich jetzt mit folgendem code abfragen:

Code:
var root = xmlHttp.responseXML.getElementsByTagName("root")[0];
alert(root.getElementsByTagName("fff")[0].firstChild.nodeValue);
alert(root.getElementsByTagName("ggg")[0].firstChild.nodeValue);

Hmmm, umständlich, aber so langsam beginne ich das System zu durchschauen, ich werde da mal weiterforschen, Danke nochmal für den Hinweis :)
 

Neue Beiträge

Zurück