Thomas Schenkeli: AJAX: Verarbeitung einer XML-Response in IE und Firefox

Hallo,

ich fordere per AJAX ein XML-File an, welches ich anschließend verarbeite (Ich möchte einen Wert aus dem XML-File auslesen).

Mein Code ist der folgende:

var xmldoc = http_request.responseXML;
var root_node = xmldoc.getElementsByTagName('isUnique').item(0);
alert(root_node.firstChild.data);

Mein XML schaut folgendermaßen aus:
<?xml version="1.0" encoding="ISO-8859-15"?>
<HC:Envelope xmlns:HC="www.hollomey.com" DocumentInfo="2006.07.26 14:29:16#http://dev-www-0/GMT/servlet/GenericServlet?service=Hella.GMT.InfoData&amp;ProjectDeeNumber=855&amp;ProjectDefinition=855&amp;ProjectID=855&amp;DS=GMT.Project.Put.Basics.Check.DefinitionDEE">
HC:Parameter
  <ProjectDeeNumber><![CDATA[855]]></ProjectDeeNumber>
  <ProjectDefinition><![CDATA[855]]></ProjectDefinition>
  <ProjectID><![CDATA[855]]></ProjectID>
</HC:Parameter>
HC:Data
  <isUnique>Y</isUnique>
</HC:Data>
</HC:Envelope>

Unter Firefox klappt das super, ich kann auf das gewünschte XML-Element zugreifen und bekomme den Inhalt zurück, im Internet Explorer bekomme ich aber die Fehlermeldung: "Objekt erforderlich" beim Versuch die alert-Message aufzurufen, da die getElementsByTagName-Methode nichts zurück liefert. Anscheinend wird die an dieser Stelle vom IE nicht unterstützt.

Weiß jemand wie ich auf den gewünschten XML-Knotenpunkt zugreifen kann so dass es mit Firefox und IE funktioniert?

Der selbe Fehler ist auch einem anderen Benutzer untergekommen:
http://www.devshare.de/viewtopic.php?id=41272, nur leider hat der auch keine Antwort erhalten.

lg & Danke
Thomas

  1. Hallo,

    Mein Code ist der folgende:

    var xmldoc = http_request.responseXML;

    alert(xmldoc); //kommt hier [object] oder null?

    var root_node = xmldoc.getElementsByTagName('isUnique').item(0);
    alert(root_node.firstChild.data);

    Mein XML schaut folgendermaßen aus:
    <?xml version="1.0" encoding="ISO-8859-15"?>
    <HC:Envelope xmlns:HC="www.hollomey.com" DocumentInfo="2006.07.26 14:29:16#http://dev-www-0/GMT/servlet/GenericServlet?service=Hella.GMT.InfoData&amp;ProjectDeeNumber=855&amp;ProjectDefinition=855&amp;ProjectID=855&amp;DS=GMT.Project.Put.Basics.Check.DefinitionDEE">
    HC:Parameter
      <ProjectDeeNumber><![CDATA[855]]></ProjectDeeNumber>
      <ProjectDefinition><![CDATA[855]]></ProjectDefinition>
      <ProjectID><![CDATA[855]]></ProjectID>
    </HC:Parameter>
    HC:Data
      <isUnique>Y</isUnique>
    </HC:Data>
    </HC:Envelope>

    Das wird von einer serverseitigen Sprache generiert? Ansonsten müsen die \ da unbedingt raus!

    Unter Firefox klappt das super, ich kann auf das gewünschte XML-Element zugreifen und bekomme den Inhalt zurück, im Internet Explorer bekomme ich aber die Fehlermeldung: "Objekt erforderlich" beim Versuch die alert-Message aufzurufen, da die getElementsByTagName-Methode nichts zurück liefert. Anscheinend wird die an dieser Stelle vom IE nicht unterstützt.

    Mit welchem Content-Type im HTTP-Response Header wird das ausgeliefert? IE kann nur application/xml oder text/xml per .responseXML verarbeiten. Ruf mal die XML-Ressource im FireFox einzeln auf und schau dann bei Extras-Seiteninformationen.

    viele Grüße

    Axel

    1. Hallo,

      Mit welchem Content-Type im HTTP-Response Header wird das ausgeliefert? IE kann nur application/xml oder text/xml per .responseXML verarbeiten. Ruf mal die XML-Ressource im FireFox einzeln auf und schau dann bei Extras-Seiteninformationen.

      Ein: alert(http_request.getAllResponseHeaders()); tut's auch ;-)

      Grüße
      Thomas

    2. Das wird von einer serverseitigen Sprache generiert? Ansonsten müsen die \ da unbedingt raus!

      Wird Datenbankseitig erstellt und der "Text" wurde aus dem JavaScript-Debugger für Firefox (Vankman) heraus kopiert. Der fügt da oft solche Escape-Sqeuenzen ein um die Sachen anzeigen zu können.

      Unter Firefox klappt das super, ich kann auf das gewünschte XML-Element zugreifen und bekomme den Inhalt zurück, im Internet Explorer bekomme ich aber die Fehlermeldung: "Objekt erforderlich" beim Versuch die alert-Message aufzurufen, da die getElementsByTagName-Methode nichts zurück liefert. Anscheinend wird die an dieser Stelle vom IE nicht unterstützt.

      Mit welchem Content-Type im HTTP-Response Header wird das ausgeliefert? IE kann nur application/xml oder text/xml per .responseXML verarbeiten. Ruf mal die XML-Ressource im FireFox einzeln auf und schau dann bei Extras-Seiteninformationen.

      Hab gerade nachgesehen, da steht: "text/html" also was falsches. Für Mozilla kann ich das richtige Encoding ja erwzingen, für den IE gibt es da nichts? Werd mal das Encoding auf Datenbankseite umstellen.

      viele Grüße

      lg

      Axel

      Thomas

      1. Hallo,

        Hab gerade nachgesehen, da steht: "text/html" also was falsches.

        Das kann eigentlich auch der FireFox nicht als XML parsen, jedenfalls meiner nicht ;-). Was er könnte, aber der IE nicht, ist application/xhtml+xml.

        Für Mozilla kann ich das richtige Encoding ja erwzingen,

        Encoding?

        viele Grüße

        Axel

      2. Hallo,

        Mit welchem Content-Type im HTTP-Response Header wird das ausgeliefert? IE kann nur application/xml oder text/xml per .responseXML verarbeiten. Ruf mal die XML-Ressource im FireFox einzeln auf und schau dann bei Extras-Seiteninformationen.

        Hab gerade nachgesehen, da steht: "text/html" also was falsches. Für Mozilla kann ich das richtige Encoding ja erwzingen, für den IE gibt es da nichts?

        Doch, für den IE kannst du das auch selbst angeben:

        var xmldoc = http_request.responseXML;
        Response.ContentType = "text/xml";
        Response.Write (xmldoc.xml);

        Grüße
        Thomas

        1. Hallo,

          Hab gerade nachgesehen, da steht: "text/html" also was falsches. Für Mozilla kann ich das richtige Encoding ja erwzingen, für den IE gibt es da nichts?

          Doch, für den IE kannst du das auch selbst angeben:

          var xmldoc = http_request.responseXML;
          Response.ContentType = "text/xml";
          Response.Write (xmldoc.xml);

          Wo gibst Du das an? Im clientseitigen JavaScript? Da gibt es bei mir weder im IE noch im FireFox ein Response Object.

          viele Grüße

          Axel

          1. Hallo,

            var xmldoc = http_request.responseXML;
            Response.ContentType = "text/xml";
            Response.Write (xmldoc.xml);
            Wo gibst Du das an? Im clientseitigen JavaScript?

            Nein, sorry.
            Da habe ich einfach übersehen, dass dies nur mit dem ServerXMLHTTP (z.B. Server.CreateObject ("MSXML2.ServerXMLHTTP.4.0");) geht, also nur im serverseitig verarbeiteten Scripts.

            Grüße
            Thomas

            1. Hallo,

              Da habe ich einfach übersehen, dass dies nur mit dem ServerXMLHTTP (z.B. Server.CreateObject ("MSXML2.ServerXMLHTTP.4.0");) geht, also nur im serverseitig verarbeiteten Scripts.

              Mozilla kann das übrigens wirklich clientseitig
              http://kb.mozillazine.org/XMLHttpRequest#responseXML_and_overrideMimeType.28.29. Das kann aber eben nur das im Mozilla(und kompatiblen) erzeugte Objekt, der ActiveX-Vorfahre bzw. das XMLHttpRequest Object von Microsoft kann nur http://msdn.microsoft.com/workshop/author/dhtml/reference/objects/obj_xmlhttprequest.asp?frame=true.

              viele Grüße

              Axel

  2. Hallo,

    ich fordere per AJAX ein XML-File an, welches ich anschließend verarbeite (Ich möchte einen Wert aus dem XML-File auslesen).

    Mein Code ist der folgende:

    var xmldoc = http_request.responseXML;
    var root_node = xmldoc.getElementsByTagName('isUnique').item(0);
    alert(root_node.firstChild.data);

    Versuche es mit:
    var root_node = xmldoc.selectSingleNode("//isUnique");
    alert(root_node.firstChild.data);

    Mein XML schaut folgendermaßen aus:
    <?xml version="1.0" encoding="ISO-8859-15"?>

    Wie gesagt, das ist so kein XML, die » \ « müssen da weg.

    <HC:Envelope xmlns:HC="www.hollomey.com"

    Oh, das kommt mir bekannt vor ;-)

    Grüße
    Thomas

    1. ... nachtrag,

      Mein Code ist der folgende:

      var xmldoc = http_request.responseXML;
      var root_node = xmldoc.getElementsByTagName('isUnique').item(0);
      alert(root_node.firstChild.data);

      in meinem Test funktionierte auch der Code aber.

      Thomas

    2. Hallo,

      Mein XML schaut folgendermaßen aus:
      <?xml version="1.0" encoding="ISO-8859-15"?>

      Wie gesagt, das ist so kein XML, die » \ « müssen da weg.

      Wie gesagt ;-), die entstehen durch die Anzeige im Venkman JavaScript Debugger, die sind also sicher nicht das Problem.

      <HC:Envelope xmlns:HC="www.hollomey.com"

      Oh, das kommt mir bekannt vor ;-)

      Kann schon sein, ist nicht die erste Anfrage im Forum ;-)

      Grüße
      Thomas

      lg
      Thomas