Ben: XML parsen --> Fehler im IE

Hallo zusammen

Ich versuche gerade ein XML-Dokument mit JS zu parsen. Im Firefox und auch im Opera funktioniert das ganze eigentlich auch wunderbar. Lediglich im IE kommt der Fehler "Objekt erforderlich". Der IE-Bug mit den Anzahl Knoten ist mir bekannt, aber es spielt ja in diesem Beispiel keine Rolle, wieviel Knoten angezeigt werden, es kommt ja immer der obengenannte Fehler im IE. Ich habe unten mal das XML-Dokument und ein JS-Codeausschnitt gepostet.

Hat jemand von euch eine Idee, wo der Fehler liegt?

Danke und Gruss
Ben

  
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>  
<auswahlen>  
<artikel id="5">  
<name>Auto</name>  
<jahr>2004</jahr>  
</artikel>  
<artikel id="3">  
<name>Fahrrad</name>  
<jahr>1984</jahr>  
</artikel>  
</auswahlen>  

  
var allEl = req.responseXML.getElementsByTagName("auswahlen");  
alert(allEl[0].childNodes.length);  

  1. Hallo,

    Ich versuche gerade ein XML-Dokument mit JS zu parsen. Im Firefox und auch im Opera funktioniert das ganze eigentlich auch wunderbar. Lediglich im IE kommt der Fehler "Objekt erforderlich".

    Der IE-Bug mit den Anzahl Knoten ist mir bekannt,

    Huch? Mir nicht. Hast Du da einen Link?

    Hat jemand von euch eine Idee, wo der Fehler liegt?

    var allEl = req.responseXML.getElementsByTagName("auswahlen");
    alert(allEl[0].childNodes.length);

      
    Was wird bei  
      
    ~~~javascript
      
    alert(req.getAllResponseHeaders());  
    
    

    als Content-Type ausgegeben? Bitte das alert _vor_ dem Versuch, auf req.responseXML zuzugreifen, einfügen.
    viele Grüße

    Axel

    1. Hallo Axel

      Betreffend IE-Bug:
      http://de.selfhtml.org/javascript/objekte/node.htm#child_nodes
      Dort bei "Beachten Sie:" schauen...

      Ich erzeuge das XML-Dokument mit PHP und sende den Header Content-type: text/xml mit. Habe das auch nochmals mit dem von dir vorgeschlagenen Befehl überprüft. Daran kann es also nicht liegen.

      Gruss Ben

      1. Hallo,

        Betreffend IE-Bug:

        http://de.selfhtml.org/javascript/objekte/node.htm#child_nodes

        Dort bei "Beachten Sie:" schauen...

        Ah Ja, das meinst Du. Das war mir bekannt.

        Ich erzeuge das XML-Dokument mit PHP und sende den Header Content-type: text/xml mit. Habe das auch nochmals mit dem von dir vorgeschlagenen Befehl überprüft. Daran kann es also nicht liegen.

        Dann brauchen wir mehr von Deinem XMLHttpRequest-JavaScript. Bei mir funktioniert das mit Deinem XML mit Content-Type: text/xml und auch mit Content-Type: application/xml, aber im IE nicht mit Content-Type: application/xhtml+xml, da nur in FF und Opera.

        viele Grüße

        Axel

        1. Guten morgen

          Also, hier mal mehr von meinem Script. Erst mal die Initialisierungsfunktion. Dieser Teil funktioniert allerdings in anderem Zusammenhang wunderbar.

            
          function AjaxInit() {  
                  try {  
                    if( window.XMLHttpRequest ) {  
                      req = new XMLHttpRequest();  
                    } else if( window.ActiveXObject ) {  
                      req = new ActiveXObject( "Microsoft.XMLHTTP" );  
                    } else {  
                      alert( "Ihr Webbrowser unterstuetzt leider kein Ajax!" );  
                    }  
                    if( req.overrideMimeType ) {  
                        req.overrideMimeType( "text/xml" );  
                    }  
                  } catch( e ) {  
                    alert( "Fehler: " + e );  
                  }  
                }  
          
          

          Dann hier der AJAX-Request:

            
          function showArtikelReq() {  
                  if( req ) {  
                    var url = "";  
                    url = basicUrl + "?produzent=" + escape( document.getElementById("produzent").options[document.getElementById("produzent").selectedIndex].value );  
                    req.open( "GET", url, true );  
                    req.onreadystatechange = showArtikel;  
                    req.send( null );  
                  }  
                }  
          
          

          Und hier noch die Verarbeitung:
          [code lang=javascript]
          function showArtikel() {
                  if( 4 == req.readyState ) {
                    if( 200 != req.status ) {
                      alert( "Fehler " + req.status + ": " + req.statusText );
                    }
                    else {
                      var allEl = req.responseXML.getElementsByTagName("auswahlen");

          alert(allEl[0].childNodes.length);
                    }
                  }
                }

          Gruss Ben

          1. Hallo,

            Und hier noch die Verarbeitung:

            function showArtikel() {
                    if( 4 == req.readyState ) {
                      if( 200 != req.status ) {
                        alert( "Fehler " + req.status + ": " + req.statusText );
                      }
                      else {

            alert(httpRequest.getAllResponseHeaders());
                           //Hier kommt Content-Type: text/xml?

            alert(httpRequest.responseText);
                           //Hier steht wirklich das XML aus [pref:t=144572;m=938068]?
                           //Da ist nicht zufällig ein Nicht-ASCII-Zeichen mit drin? [1]

            var allEl = req.responseXML.getElementsByTagName("auswahlen");

            alert(allEl[0].childNodes.length);
                      }
                    }
                  }

            »»

              
            [1] Sollten im XML Nicht-ASCII-Zeichen enthalten sein, \_müssen\_ diese UTF-8-encodiert ausgeliefert werden, sonst scheitert der IE an <?xml version="1.0" encoding="UTF-8" ?>. FF kann das XML auch mit ISO-encodierten Zeichen parsen, stellt die Zeichen dann natürlich nur nicht korrekt dar.  
              
            viele Grüße  
              
            Axel
            
            1. Hallo,

              *grr* Copy&Paste ;-)

              Und hier noch die Verarbeitung:

              function showArtikel() {
                      if( 4 == req.readyState ) {
                        if( 200 != req.status ) {
                          alert( "Fehler " + req.status + ": " + req.statusText );
                        }
                        else {
                             alert(req.getAllResponseHeaders());
                             //Hier kommt Content-Type: text/xml?

              alert(req.responseText);
                             //Hier steht wirklich das XML aus [pref:t=144572;m=938068]?
                             //Da ist nicht zufällig ein Nicht-ASCII-Zeichen mit drin? [1]

              var allEl = req.responseXML.getElementsByTagName("auswahlen");

              alert(allEl[0].childNodes.length);
                        }
                      }
                    }
              »»

              
              >   
              > [1] Sollten im XML Nicht-ASCII-Zeichen enthalten sein, \_müssen\_ diese UTF-8-encodiert ausgeliefert werden, sonst scheitert der IE an <?xml version="1.0" encoding="UTF-8" ?>. FF kann das XML auch mit ISO-encodierten Zeichen parsen, stellt die Zeichen dann natürlich nur nicht korrekt dar.  
              >   
              > viele Grüße  
              >   
              > Axel  
                
              viele Grüße  
                
              Axel
              
              1. Hallo Axel

                Tatsächlich, im definitiven XML-Dokument hatte ich ein 'é' drin. Nun funktioniert es. Du bist super...

                Trotzdem habe ich noch eine Frage: Ich dachte eigentlich, wenn ich etwas UTF8-Kodiert habe, sind diese Zeichen schon im Zeichensatz mit drin, ich muss sie also nicht speziell behandeln. Wieso ist dem nicht so? Anscheinend habe ich hier irgendwas falsch verstanden...

                Vielen Dank und Gruss
                Ben

                1. hi,

                  Tatsächlich, im definitiven XML-Dokument hatte ich ein 'é' drin. Nun funktioniert es. Du bist super...

                  Trotzdem habe ich noch eine Frage: Ich dachte eigentlich, wenn ich etwas UTF8-Kodiert habe, sind diese Zeichen schon im Zeichensatz mit drin, ich muss sie also nicht speziell behandeln. Wieso ist dem nicht so?

                  Weil du vermutlich nur "denkst" (eher glaubst), é in UTF-8 kodiert in dein Dokument eingefügt zu haben.

                  Anscheinend habe ich hier irgendwas falsch verstanden...

                  Vielleicht verwechselst du die Angabe zur Zeichenkodierung (Content-Type-Header, Angabe im XML-Prolog) mit dem Vorgang der tatsächlichen Kodierung eines Zeichens (welche natürlich irgendwo beim Editieren/Abspeichern stattgefunden haben muss).

                  gruß,
                  wahsaga

                  --
                  /voodoo.css:
                  #GeorgeWBush { position:absolute; bottom:-6ft; }
                2. Hallo,

                  Tatsächlich, im definitiven XML-Dokument hatte ich ein 'é' drin. Nun funktioniert es. Du bist super...

                  Trotzdem habe ich noch eine Frage: Ich dachte eigentlich, wenn ich etwas UTF8-Kodiert habe, sind diese Zeichen schon im Zeichensatz mit drin, ich muss sie also nicht speziell behandeln. Wieso ist dem nicht so? Anscheinend habe ich hier irgendwas falsch verstanden...

                  Hast Du wirklich UTF-8 encodierte Zeichenketten vorliegen? Diese entstehen beispielsweise, wenn Du dein XML-File mit einem Text-Editor, der das kann, in UTF-8-Encoding abspeicherst. Bleiben wir bei Deinem Beispiel:

                  Das Zeichen é hat den Code 0xE9. In einem ISO-8859-1 encodierten File würde dieser Code das Zeichen é repräsentieren, also so im File stehen. In diesen charsets stehen aber nur 1 Byte je Zeichen, also 255 unterschiedliche Zeichen zur Verfügung. In UTF-8 werden nur ASCII-Zeichen (0x00 - 0x7F) so kodiert. Andere Zeichen haben zwei, drei oder mehr Byte (siehe http://de.wikipedia.org/wiki/UTF-8). Das é wäre in UTF-8 0xCE89. In einem UTF-8-File müssten also die Bytes 0xCE89 für é stehen.

                  Wenn Du diese UTF-8 encodierten Dateien dann mit einer Programmiersprache (z.B. PHP) weiterbearbeitest, dann müssen die Funktionen dieser Programmiersprache mit UTF-8 umgehen können. Inwieweit das PHP-Funktionen können, sollte im PHP-Handbuch stehen.

                  Die Angabe des charset in Deklarationen (z.B.: <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>) dient _nur_ dazu, der Software, welche diese Dokumente dann parsen soll, mitzuteilen, welches charset verwendet wurde. Die Angabe des charset allein macht aber aus einem/einer ISO-encodierten File/Ressource kein/e UTF-encodiertes File/Ressource.

                  viele Grüße

                  Axel

                  1. Hallo,

                    (siehe http://de.wikipedia.org/wiki/UTF-8). Das é wäre in UTF-8 0xCE89. In einem UTF-8-File müssten also die Bytes 0xCE89 für é stehen.

                    *g* binäres Shift im Kopf geht schief ;-)
                    Das é wäre in UTF-8 0xC3A9. In einem UTF-8-File müssten also die Bytes 0xC3A9 für é stehen.

                    viele Grüße

                    Axel