http_request.responseXML gibt im IE ein leeres XML-Dokument zurück

Hi Master Of Chess!
Die Idee mit dem application/xml hatte ich auch schon... hat nicht geklappt.
Die XML-Daten sind auch korrekt und sehen in etwa so aus:
XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<places>
	<place>
		<placeName>Höxter</placeName>
		<placeID>21</placeID>
	</place>
	<place>
		<placeName>Brakel</placeName>
		<placeID>22</placeID>
	</place>
	<place>
		<placeName>Bad Driburg</placeName>
		<placeID>23</placeID>
	</place>
</places>
 
Zuletzt bearbeitet von einem Moderator:
Könntest du evtl. auch noch den entsprechenden Ausschnitt aus deinem JS posten? Das wäre unter Umständen hilfreich. Es ist nämlich auch noch die Frage, ob du den Antworttext direkt alse responseText oder XML verarbeitest...

Schönen Tag noch
Master of Chess
 
Das ganze Skript:

im 1. select-Feld wähle ich eine Kreistadt. Der Inhalt des 2. select-Feldes wird durch die Wahl des 1. Feldes bestimmt. Hier kommen die zu der Kreisstadt gehörenden Orte rein. Den Job soll AJAX (XHConn library) mit Unterstützung von PHP und MySQL erledigen.

HTML:
<!-- 1. select-Feld - enthält die Kreisstädte -->
<select name="district" size="1" onchange="getPlaces(this.value)">
	<option value="2">Höxter</option>
	<option value="20">Paderborn</option>
	<option value="24">Lippe</option>
</select>

<!-- 2. select-Feld - wird von AJAX/PHP generiert bei Auswahl einer Kreisstadt -->
<select id="selectPlaces" name="place" size="1">
	<option> </option>
</select>

Die JavaScriptFunktion getPlaces() übergibt per 'GET' die ID des Kreises an die getPlaces.php, die wiederum durch eine SQL-Abfrage XML-Daten generiert und diese an die getPlaces() zurückgibt. Die XML-Daten werden per JavaScript geparst und in die HTML-Struktur eingebunden.

getPlaces.php sieht in etwa so aus:
PHP:
<?PHP
header('Content-type: text/xml; charset=utf-8');

/* SQL-Abfrage... speichert das Ergebnis in der $optionPlaces */

print $optionPlaces;
?>

Die von der getPlaces.php generierten XML-Daten sehen in etwa so aus:
XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<places>
	<place>
		<placeName>Höxter</placeName>
		<placeID>21</placeID>
	</place>
	<place>
		<placeName>Brakel</placeName>
		<placeID>22</placeID>
	</place>
	<place>
		<placeName>Bad Driburg</placeName>
		<placeID>23</placeID>
	</place>
</places>

die getPlaces() sieht so aus:
Code:
function getPlaces(IDDistrict) {
	var myConn = new XHConn();
	var selectPlaces = document.getElementById('selectPlaces');

	var fnWhenDone = function(oXML) {
		var myXML = oXML.responseXML;
		
		for(i=0; i<myXML.getElementsByTagName('place').length; i++){


			var place = myXML.getElementsByTagName('place')[i];
			var placeName = place.getElementsByTagName('placeName')[0].firstChild.data;
			var placeID = place.getElementsByTagName('placeID')[0].firstChild.data;

			var newOPTIONText = document.createTextNode(placeName);
			var newOPTION = document.createElement("option");
			
			selectPlaces.appendChild(newOPTION);
			newOPTION.setAttribute('value', placeID);
			newOPTION.appendChild(newOPTIONText);	
		}
	}
	if (!myConn) alert("XMLHTTP not available. Try a newer/better browser.");
	myConn.connect("getPlaces.php", "GET", "IDDistrict="+IDDistrict, fnWhenDone);
}

Der Witz ist nun folgender...
Wenn ich die XML-Daten nicht von der getPlaces.php generieren lasse, sondern der getPlaces() eine fertige XML-Datei übergebe
Code:
myConn.connect("getPlaces.xml", "GET", "IDDistrict="+IDDistrict, fnWhenDone);
dann kann der IE damit umgehen, sprich, der IE erhält dann ein Objekt, dass nicht null ist.

Meine Vermutung ist, dass der IE Dateien, die keine xml-Endung haben, schlicht und ergreifend nicht als xml-Dateien behandeln will... selbst wenn der Webserver ihm über den Header mitteilt, dass es sich um XML-Daten handelt.

Habe auch versucht, die getPlaces.php in getPlaces.xml umzubenennen, und dann dem Server über .htaccess mitzuteilen, dass er doch bitte xml-Dateien wie php-Dateien behandeln soll. Aber da macht anscheinend mein Provider nicht mit...
 
Zuletzt bearbeitet von einem Moderator:
Hmm... Mit XHConn kenn ich mich jetzt nicht so aus, ich bin eher so für reines JS ^^ Aber wie dem auch sei. Du musst auch beachten, dass das PHP-Skript nicht nur den Header für UTF-8 ausgibt, sondern auch die Daten an sich so kodiert. Probier mal:

PHP:
echo utf8_encode($optionPlaces);

Schönen Tag noch
Master of Chess
 
Das habe ich zwar nicht ganz verstanden, habs aber trotzdem mal ausprobiert... ohne Erfolg.

die ursprüngliche Datei getPlaces.php?IDDistrict=20
PHP:
<?PHP
header('Content-type: text/xml; charset=utf-8');

/*  */

echo $optionPlaces;
?>

die neue Datei getPlaces_echo_utf8_encode.php?IDDistrict=20
PHP:
<?PHP
header('Content-type: text/xml; charset=utf-8');

/*  */

echo utf8_encode($optionPlaces);
?>

Der Witz ist, dass der IE bei direktem Aufruf dieser Seiten sie durchaus als xml-Dateien sieht. Nur wenn er sie über AJAX parsen soll, nimmt er sie nicht an
 
Sorry, mal ne ganz blöde Frage: Hast du also du die Datei eben umbenannt hast, auch den Namen im JS geändert? Manchmal passieren einem da solche Fehler...

Mich würd mal interessieren, ob der Inhalt der XML-Datei überhaupt übertragen wird. Dazu könntest du mal folgendes probieren:
Code:
function getPlaces(IDDistrict) {
	var myConn = new XHConn();
	var selectPlaces = document.getElementById('selectPlaces');

	var fnWhenDone = function(oXML) {
		var myXML = oXML.responseXML;
		alert(oXML.responseText);
		
		for(i=0; i<myXML.getElementsByTagName('place').length; i++){


			var place = myXML.getElementsByTagName('place')[i];
			var placeName = place.getElementsByTagName('placeName')[0].firstChild.data;
			var placeID = place.getElementsByTagName('placeID')[0].firstChild.data;

			var newOPTIONText = document.createTextNode(placeName);
			var newOPTION = document.createElement("option");
			
			selectPlaces.appendChild(newOPTION);
			newOPTION.setAttribute('value', placeID);
			newOPTION.appendChild(newOPTIONText);	
		}
	}
	if (!myConn) alert("XMLHTTP not available. Try a newer/better browser.");
	myConn.connect("getPlaces.php", "GET", "IDDistrict="+IDDistrict, fnWhenDone);
}

Wenn jetzt der Inhalt der XML-Datei ausgegeben wird, dann wissen wir immerhin schon mal, dass es am Parsen der Datei an sich liegt.

Schönen Tag noch
Master of Chess
 
alles schon ausprobiert *schnief*
mit alert(oXML.responseXML) sagt mir der IE, dass er ein object erhällt. Allerdings enthällt dieses Objekt keine Tags mit den TagNamen 'places' oder 'place'...

alert('Anzahl der Orte: ' + myXML.getElementsByTagName('place').length);
Anzahl der Orte: 0

Ich habe inzwischen die ganze Geschichte anders gelöst. Die getPlaces.php generiert keine XML-Daten sondern HTML-Code. Dieser wird per responseText mit Hilfe von innerHTML in die HTML-Struktur eingebaut. Funktioniert einwandfrei sowohl in FF als auch im IE.

Aber mich ärgert es dennoch, dass ich es nicht über responseXML hinbekommen hab. Ich möchte gern AJAX und nicht AJAText nutzen können
 
Hi,

mit folgender getPlaces.php funktioniert es bei mir im IE.
Code:
<?php
	header('Content-type: text/xml', true);
	$optionPlaces = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n";
	$optionPlaces .= "<places>\n";
	$optionPlaces .= "    <place>\n";
	$optionPlaces .= "        <placeName>Höxter</placeName>\n";
	$optionPlaces .= "        <placeID>21</placeID>\n";
	$optionPlaces .= "    </place>\n";
	$optionPlaces .= "    <place>\n";
	$optionPlaces .= "        <placeName>Brakel</placeName>\n";
	$optionPlaces .= "        <placeID>22</placeID>\n";
	$optionPlaces .= "    </place>\n";
	$optionPlaces .= "    <place>\n";
	$optionPlaces .= "        <placeName>Bad Driburg</placeName>\n";
	$optionPlaces .= "        <placeID>23</placeID>\n";
	$optionPlaces .= "    </place>\n";
	$optionPlaces .= "</places>\n";

        echo utf8_encode($optionPlaces);
?>
Ciao
Quaese
 
Hi Quaese!

Habe die Lösung zu meinem Problem gefunden... Jetzt würde ich die Lösung noch gern verstehen!
Meine getPlaces.php sah eigentlich so aus:
PHP:
<?PHP
header('Content-type: text/xml; charset=utf-8');
session_start();
include('session.php');
include('db.connect.php');

/* SQL-Abfrage ... speichern in $optionPlaces */

echo $optionPlaces;
?>
in der 2. Zeile starte ich eine Session
in der 3. Zeile include ich eine datei, die überprüfen soll, ob der User eingelogt ist

Habe die 2. und die 3. Zeile gelöscht...
... jetzt steht im Header, den der Webserver an den Client sendet
Code:
Content-Type: text/xml; charset=utf-8
und der IE tut das, was ich von ihm erwarte.
Als die 2. und 3. Zeile noch da waren, meldete der Server dem Client immer
Code:
Content-Type: text/html; charset=utf-8

Auf jeden Fall vielen Dank für deine Hilfe, und bis zum nächsten Problem
Gruß
esviko
 
Zurück