tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
19
ZUGRIFFE
4601
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    harmonica harmonica ist offline Rookie
    Registriert seit
    Feb 2007
    Beiträge
    7
    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:
    Code :
    1
    2
    3
    4
    
    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:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    
    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.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    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.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    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.
     

  2. #2
    Avatar von Master of Chess
    Master of Chess Master of Chess ist offline Mitglied Bronze
    Registriert seit
    Jun 2007
    Ort
    Berlin!
    Beiträge
    34
    Überprüfe mal, ob es geht, wenn du auch exakt die selben Header-Infos der Beispiel-Seite übernimmst.

    Versuche sonst mal statt
    Code javascript:
    1
    
    http_request.responseXML

    Code javascript:
    1
    
    http_request.responseXML.xml

    Hoffe, das hilft dir
    Master of Chess
     
    >> Wenn Microsoft die Lösung ist, will ich mein Problem zurück! <<

  3. #3
    harmonica harmonica ist offline Rookie
    Registriert seit
    Feb 2007
    Beiträge
    7
    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.

    HTML-Code:
    <!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.
     

  4. #4
    Avatar von Master of Chess
    Master of Chess Master of Chess ist offline Mitglied Bronze
    Registriert seit
    Jun 2007
    Ort
    Berlin!
    Beiträge
    34
    Du kannst ja zum Test auch nochmal die genutzte test.xml benutzen. Vielleicht liegt's an der XML-Datei?
     
    >> Wenn Microsoft die Lösung ist, will ich mein Problem zurück! <<

  5. #5
    harmonica harmonica ist offline Rookie
    Registriert seit
    Feb 2007
    Beiträge
    7
    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

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
     
    <?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.
     

  6. #6
    Avatar von Master of Chess
    Master of Chess Master of Chess ist offline Mitglied Bronze
    Registriert seit
    Jun 2007
    Ort
    Berlin!
    Beiträge
    34
    Dann sag ihm per PHP doch mit der header()-Funktion dass der Content-Type text/xml ist. Dann müsste es gehen. Also:

    PHP-Code:
    header('Content-Type: text/xml'); 
    btw: Was findest du übrigens am IE gut

    Schönen Tag noch
    Master of Chess
    Geändert von Master of Chess (15.07.07 um 18:36 Uhr) Grund: Code-Schnipsel ergänzt, *argh* Tippfehler
     
    >> Wenn Microsoft die Lösung ist, will ich mein Problem zurück! <<

  7. #7
    harmonica harmonica ist offline Rookie
    Registriert seit
    Feb 2007
    Beiträge
    7
    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.
    Code :
    1
    2
    
    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.
     

  8. #8
    harmonica harmonica ist offline Rookie
    Registriert seit
    Feb 2007
    Beiträge
    7
    Zitat Zitat von Master of Chess Beitrag anzeigen
    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
     

  9. #9
    esviko esviko ist offline Rookie
    Registriert seit
    May 2008
    Beiträge
    6
    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)
    Code :
    1
    
    myConn.connect("getPlaces.xml", "GET", "IDDistrict="+IDDistrict, fnWhenDone);

    übergebe ich ihm aber von PHP generierte xml-Daten, so spielt er nicht mit
    Code :
    1
    
    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-Code:
    <?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!
     

  10. #10
    Avatar von Master of Chess
    Master of Chess Master of Chess ist offline Mitglied Bronze
    Registriert seit
    Jun 2007
    Ort
    Berlin!
    Beiträge
    34
    Erstmal herzlich willkommen im Forum!

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

    PHP-Code:
    header('Content-Type: application/xml'); 
    Außerdem solltest du darauf achten, dass dein erzeugtes XML-Dokument mit

    HTML-Code:
    <xml version="1.0" encoding="UTF-8">
    beginnt.

    Einen schönen Tag noch
    Master of Chess
     
    >> Wenn Microsoft die Lösung ist, will ich mein Problem zurück! <<

  11. #11
    esviko esviko ist offline Rookie
    Registriert seit
    May 2008
    Beiträge
    6
    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:
    Code xml:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    <?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>
     

  12. #12
    Avatar von Master of Chess
    Master of Chess Master of Chess ist offline Mitglied Bronze
    Registriert seit
    Jun 2007
    Ort
    Berlin!
    Beiträge
    34
    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
     
    >> Wenn Microsoft die Lösung ist, will ich mein Problem zurück! <<

  13. #13
    esviko esviko ist offline Rookie
    Registriert seit
    May 2008
    Beiträge
    6
    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-Code:
    <!-- 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-Code:
    <?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:
    Code xml:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    <?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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    function getPlaces(IDDistrict) {
        var myConn = new XHConn();
        var selectPlaces = document.getElementById('selectPlaces');
     
        var fnWhenDone = function(oXML) {
            var myXML = oXML.[B]responseXML[/B];
            
            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("[B][COLOR="DarkRed"]getPlaces.php[/COLOR][/B]", "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 :
    1
    
    myConn.connect("[B][COLOR="DarkRed"]getPlaces.xml[/COLOR][/B]", "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...
     

  14. #14
    Avatar von Master of Chess
    Master of Chess Master of Chess ist offline Mitglied Bronze
    Registriert seit
    Jun 2007
    Ort
    Berlin!
    Beiträge
    34
    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-Code:
    echo utf8_encode($optionPlaces); 
    Schönen Tag noch
    Master of Chess
     
    >> Wenn Microsoft die Lösung ist, will ich mein Problem zurück! <<

  15. #15
    esviko esviko ist offline Rookie
    Registriert seit
    May 2008
    Beiträge
    6
    Das habe ich zwar nicht ganz verstanden, habs aber trotzdem mal ausprobiert... ohne Erfolg.

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

    /*  */

    echo $optionPlaces;
    ?>
    die neue Datei getPlaces_echo_utf8_encode.php?IDDistrict=20
    PHP-Code:
    <?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
     

Ähnliche Themen

  1. JAXB - leeres Dokument beim unmarshalling
    Von nail im Forum Java Grundlagen
    Antworten: 0
    Letzter Beitrag: 05.12.09, 13:45
  2. Eigenschaft gibt NULL zurück
    Von Briefkasten im Forum PHP
    Antworten: 2
    Letzter Beitrag: 31.12.06, 13:20
  3. Funktion gibt nix zurück
    Von Soapp im Forum PHP
    Antworten: 6
    Letzter Beitrag: 18.09.06, 19:02
  4. Leeres Word-Dokument
    Von LordDeath im Forum .NET Datenverwaltung
    Antworten: 0
    Letzter Beitrag: 14.06.06, 13:33
  5. date gibt Blödsinn zurück ?
    Von BeaTBoxX im Forum PHP
    Antworten: 5
    Letzter Beitrag: 30.03.05, 14:26