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



## harmonica (14. Juli 2007)

Hallo,


Ich möchte eigentlich nur eine simple xml-Datei auslesen über AJAX.
Das gelingt mir soweit auch nur im Internet Explorer kommt ein leeren XML-Dokument an.
Dabei gehe ich wie folgt vor:

Ich rufe mit einer Funtkion die Request-Methode auf:

```
function dbGetFormPlanData(pid)
{
	makeRequest("AJAX/getPlanData.php","fillFormPlanData","plan_id="+pid);
}
```

in der Requestmethode hole ich mir das http-Request-objekt, und weise dem onreadystatechange eine Methode zu die die gesendeten Daten auslesen soll.
Als Parameter poste ich nur eine Id welche im verlinkten php-Script zum auslesen eines Datensatzes benötigt wird:


```
function makeRequest(url,method,post) {

    http_request = false;

    if (window.XMLHttpRequest) { // Mozilla, Safari,...
        http_request = new XMLHttpRequest();
        if (http_request.overrideMimeType) {
            http_request.overrideMimeType('text/xml');
            // zu dieser Zeile siehe weiter unten
        }
    } else if (window.ActiveXObject) { // IE
        try {
            http_request = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                http_request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {}
        }
    }

    if (!http_request) {
        alert('Ende :( Kann keine XMLHTTP-Instanz erzeugen');
        return false;
    }
    //dem HTTP_Request eine methode Zuweisen die aufgerufen wird wenn der Request Abgeschlossen ist
    //addORSCMethod(method);
    http_request.onreadystatechange = fillFormPlanData;
	http_request.open('POST', url, true);
	http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	http_request.send(post);

}
```

Die gewünschte Methode wird auch durch das http-Request aufgerufen und fordert von der  Methode getXMLfromRequest das xml-Objekt an.


```
function fillFormPlanData()
{
	var xmldoc=getXMLfromRequest();
    
	if(xmldoc!=null)
	{
			
		var row=new Array();
		row['vonDate']=xmldoc.getElementsByTagName('vonDate').item(0).firstChild.data;
/*
....
*/

	}
}
```

Die Methode getXMLfromRequest liest dann die XML-Daten von dem http-Request-Objekt aus und übergibt sie. Aber schon in dieser Methode hat das XML-Objekt keine einzigen Kindknoten und ist völlig leer - im Internet Explorer. Opera und Firefox haben dies Problem nicht.


```
function getXMLfromRequest() {

    var xmldoc=null;
    if (http_request.readyState == 4) {
        if (http_request.status == 200) {
        	xmldoc = http_request.responseXML;
			//Nach Fehlerausgabe suchen
			var fehler=xmldoc.getElementsByTagName('fehler');
			//Wenn Fehler gefunden
			if(fehler.length > 0)
			{
				//dann ausgeben
				alert(fehler.item(0).firstChild.data);
			}
        } else {
            alert('Bei der Datenabfrage ist ein Problem aufgetreten.');
        }
    }
    return xmldoc;
}
```

Den größten Teil des Codes habe ich von:
http://www.w3clubs.com/mozdev/httprequest_test_xml.html

Interessant ist, dass der Code auf deren Seite funktioniert. Kopiere ich ihn aber exakt aus dem Quelltext in meine Javascript-Datei habe ich auch hiermit dasselbe Problem, dass der IE nur ein leeres XML-Dokument ausliest.
Ich bin am verzwiefeln.:suspekt:


----------



## Master of Chess (15. Juli 2007)

Überprüfe mal, ob es geht, wenn du auch exakt die selben Header-Infos der Beispiel-Seite übernimmst.

Versuche sonst mal statt

```
http_request.responseXML
```


```
http_request.responseXML.xml
```

Hoffe, das hilft dir
Master of Chess


----------



## harmonica (15. Juli 2007)

Danke für deine Hilfe.
Leider hat alles nichts gebracht.
Die Header habe ich eins-zu-eins aus dem Quellcode kopiert.
Brachte aber auch keine Änderung. Selbst der exakt kopierte Quellcode will nicht so laufen wie er es soll.
Das von dir empfohlene responseXML.xml habe ich auch ausprobiert. Es wird aber von keinem Browser akzeptiert.
Ich habe sogar den Kopf der HTML-Datei übernommen für die Datei in der das Script gestartet wird.


```
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
...
```

Trotz alledem weigert sich der IE(7) die xml-Datei auszulesen (zumindest eine sinnvoll gefüllte). Egal ob ich das Skript jetzt auf localhost oder auf dem server im netz starte.


----------



## Master of Chess (15. Juli 2007)

Du kannst ja zum Test auch nochmal die genutzte test.xml benutzen. Vielleicht liegt's an der XML-Datei?


----------



## harmonica (15. Juli 2007)

Hm ja die original xml-Datei akzeptiert er.
Jetzt bin ich so weit, dass ich davon ausgehen kann, dass der IE nur Dateien mit der
Endung .xml akzeptiert.

Spreche ich die php Datei an habe ich wieder das alte Problem.
rufe ich die php-Datei aber im ie direkt auf und speichere den erzeugten xml-code in eine
xml-Datei 


```
<?xml version="1.0" ?>
<plandata>
    <plan_id>11</plan_id>
  <vonDate>2007-07-01</vonDate>
  <vonTime>08:00:00</vonTime>
  <bisDate>2007-11-28</bisDate>
  <dauer>667</dauer>

  <wtag>7</wtag>
  <thema_id>6</thema_id>
  <titel>Nochn Thema</titel>
  <farbe>16776960</farbe>
  <beschreib>nochn Thema Themalokuiop</beschreib>
</plandata>
```
dann nimmt der ie(übrigens einer meiner allerliebsten Lieblingsbrowser  ) das an.
Jetzt muss ich ihn nur noch dazu bringen, dass er php-Dateien auch ganz toll findet.


----------



## Master of Chess (15. Juli 2007)

Dann sag ihm per PHP doch mit der header()-Funktion dass der Content-Type text/xml ist. Dann müsste es gehen. Also:


```
header('Content-Type: text/xml');
```

btw: Was findest du übrigens am IE _gut_

Schönen Tag noch
Master of Chess


----------



## harmonica (16. Juli 2007)

Danke, das blieb leider auch ohne Erfolg.
Ich habe in der .htaccess jetzt einfach Dateien mit der Endung .xml
als php Dateien eingetragen und die php-Datei in yyy.xml umbenannt. So nimmt der ie das an.

```
AddType application/x-httpd-php .php .xml
AddHandler x-httpd-php .php .xml
```
Ist zwar nicht der Königsweg aber funktioniert erst mal.
Wenn noch jemand eine einfachere Lösung hat, die auch mit .php-Dateien arbeitet, kann er/sie sich gerne bei mir melden.


----------



## harmonica (16. Juli 2007)

Master of Chess hat gesagt.:


> btw: Was findest du übrigens am IE _gut_
> Master of Chess


Solange ich nach einer Antwort suche, sollte der IE am besten aus dem Verkehr gezogen werden


----------



## esviko (3. Mai 2008)

Hi!
Habe das gleiche Problem mit dem verfluchtn IE...
übergebe ich dem IE eine fertige xml-Datei, so funktioniert er, wie ich es von ihm erwarte
(ich nutze für den HttpRequest die XHConn library)

```
myConn.connect("getPlaces.xml", "GET", "IDDistrict="+IDDistrict, fnWhenDone);
```

übergebe ich ihm aber von PHP generierte xml-Daten, so spielt er nicht mit

```
myConn.connect("getPlaces.php", "GET", "IDDistrict="+IDDistrict, fnWhenDone);
```

in der getPlaces.php habe ich natürlich den header auf Content-type: text/xml; gesetzt

```
<?PHP header('Content-type: text/xml; charset=utf-8'); ... ?>
```

Die Lösung mit der .htaccess "interpretiere *.xml als *.php!" funktioniert bei mir lieder nicht... Es ist zum verzweifeln!


----------



## Master of Chess (3. Mai 2008)

Erstmal herzlich willkommen im Forum!

Ich bin mir nicht sicher, inwieweit das standardkonform ist, aber probier doch mal


```
header('Content-Type: application/xml');
```

Außerdem solltest du darauf achten, dass dein erzeugtes XML-Dokument mit 


```
<xml version="1.0" encoding="UTF-8">
```

beginnt.

Einen schönen Tag noch
Master of Chess


----------



## esviko (3. Mai 2008)

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 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>
```


----------



## Master of Chess (3. Mai 2008)

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


----------



## esviko (3. Mai 2008)

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.


```
<!-- 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
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 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:

```
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

```
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...


----------



## Master of Chess (3. Mai 2008)

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:


```
echo utf8_encode($optionPlaces);
```

Schönen Tag noch
Master of Chess


----------



## esviko (3. Mai 2008)

Das habe ich zwar nicht ganz verstanden, habs aber trotzdem mal ausprobiert... ohne Erfolg.

die ursprüngliche Datei getPlaces.php?IDDistrict=20

```
<?PHP
header('Content-type: text/xml; charset=utf-8');

/*  */

echo $optionPlaces;
?>
```

die neue Datei getPlaces_echo_utf8_encode.php?IDDistrict=20

```
<?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


----------



## Master of Chess (3. Mai 2008)

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:

```
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


----------



## esviko (3. Mai 2008)

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


----------



## Quaese (3. Mai 2008)

Hi,

mit folgender *getPlaces.php* funktioniert es bei mir im IE.

```
<?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


----------



## esviko (3. Mai 2008)

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
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

```
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

```
Content-Type: text/html; charset=utf-8
```

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


----------



## ts230 (4. Mai 2008)

harmonica hat gesagt.:


> Solange ich nach einer Antwort suche, sollte der IE am besten aus dem Verkehr gezogen werden


Am besten sofort


----------

