NicoleK: Problem beim Auslesen einer XML-Datei

Hallo,

ich habe ein Problem beim Auslesen einer XML-Datei.

die mit PL/SQL erzeugte XML-Datei sieht folgendermaßen aus:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <result id="results">
       <divtitle>Corporate Services</divtitle>
       <divtitle>Corporate Centers</divtitle>
    </result>

Mein Aufruf in der Java-Script-Funktion sieht folgendermaßen aus:

function handleHttpResponse()
   {if (http.readyState == 4)
      {if (http.responseText.indexOf('invalid') == -1)
        {
       var xmlDocument = http.responseXML;
       alert(http.responseText);

alert(xmlDocument.getElementById('result').length);
        alert(xmlDocument.getElementsByTagName('divtitle').length);
...

wobei "http" das XMLrequestObjekt ist.

Der Fehler liegt dann an der Stelle, dass sowohl xmlDocument.getElementById('result').length als auch
xmlDocument.getElementById('divtitle').length "0" ergeben.

Meine Schlussfolgerung sagt mir also, dass das XML-Dokument nicht richtig eingelesen wird oder ich falsch auf die Knoten zugreife. Allerdings weiß ich nicht was ich falsch mache, denn bei einem ähnlichen Script funktioniert der Aufruf ohne Probleme - einziger Unterschied ist, dass die XML-Datei bei diesem Beispiel mit PHP nicht mit PL/SQL erzeugt wird.

  1. hi,

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <result id="results">
           <divtitle>Corporate Services</divtitle>
           <divtitle>Corporate Centers</divtitle>
        </result>

    Der Fehler liegt dann an der Stelle, dass sowohl xmlDocument.getElementById('result').length als auch
    xmlDocument.getElementById('divtitle').length "0" ergeben.

    Du hast weder ein Element mit der ID "result" noch eines mit der ID "divtitle" in deinem XML-Dokument.

    (Darüber hinaus wäre es sinnfrei, bei einem über die ID eindeutig selektierten Element die Länge einer Collection abfragen zu wollen - eben wegen der Eindeutigkeit liefert getElementById nun mal keine Collection, sondern direkt den Knoten zurück [im Erfolgsfall].)

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hi wahsaga,

      tut mir leid, habe das falsche geposted, heißt eigentlich

      xmlDocument.getElementsByTagName('result').length
      xmlDocument.getElementsByTagName('divtitle').length

      hatte ich vorhin beim ausprobieren geändert

      Danke schon mal

      1. Hallo,

        xmlDocument.getElementsByTagName('result').length
        xmlDocument.getElementsByTagName('divtitle').length

        Hier fehlt offenbar documentElement:

        xmlDocument.documentElement.getElementsByTagName('result').length
        xmlDocument.documentElement.getElementsByTagName('divtitle').length

        bzw. gleich vorab darauf beziehen (bezogen auf das Ausgangsposting):

        var xmlDocument = http.responseXML.documentElement

        MfG, Thomas

        1. Hi,

          vielen Dank für die schnelle Antwort.

          Also wenn ich documentElement einfüge kommt:

          bei var xmlDocument = http.responseXML.documentElement;
          im IE der Fehler "null" ist Null oder keine Objekt

          oder bei alert(xmlDocument.documentElement.getElementsByTagName('result').length);
          im IE der Fehler "documentElement" ist Null oder kein Objekt.

          Vielleicht kann ja diese Fehlermeldung zur Fehlerbehebung beitragen.

          Vielen Dank schon mal
          Nicole

          1. hi,

            Also wenn ich documentElement einfüge kommt:

            bei var xmlDocument = http.responseXML.documentElement;
            im IE der Fehler "null" ist Null oder keine Objekt

            oder bei alert(xmlDocument.documentElement.getElementsByTagName('result').length);
            im IE der Fehler "documentElement" ist Null oder kein Objekt.

            Wird denn dein XML vom Server auch mit einem korrekten Content type header ausgeliefert?

            Wenn XML-Daten lediglich als text/plain ausgeliefert werden, weigern sich manche Browser, es als XML zu behandeln.

            gruß,
            wahsaga

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
            1. Wird denn dein XML vom Server auch mit einem korrekten Content type header ausgeliefert?

              Hi,

              ehrlichgesagt habe ich keine Ahnung ob es den richtigen Content type hat. Wenn ich mir die XML-Datei im IE anzeigen lasse erkennt dieser auf jeden Fall dass es ein XML-Dokument ist.

              Ich habe in der PL/SQL-Funktion, die die XML-Datei erzeugt zwar
              "htp.p('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>');" stehen aber nichts anderes.
              Wie genau müsste denn eine explizite Angabe des Content type lauten?

              Vielen, vielen Dank schon mal.

              1. Hallo,

                Ich habe in der PL/SQL-Funktion, die die XML-Datei erzeugt zwar
                "htp.p('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>');" stehen aber nichts anderes.
                Wie genau müsste denn eine explizite Angabe des Content type lauten?

                text/xml oder application/xml

                Dann schreibe mal vor der Ausgabe der XML-Deklaration (wenn ich htp.p(...) syntaktisch richtig interpretiere):

                htp.p('Content-Type: text/xml');

                MfG, Thomas

                1. Dann schreibe mal vor der Ausgabe der XML-Deklaration (wenn ich htp.p(...) syntaktisch richtig interpretiere):

                  htp.p('Content-Type: text/xml');

                  MfG, Thomas

                  Hi,

                  habe das gerade versucht...
                  aber dann "funktioniert" meine XML-Dokument nicht mehr-
                  der Fehler lautet "End of headers not found!"...
                  ich habe keine Ahnung wie ich den Header abschließen soll, schließlich habe ich ihn ja nicht explizit geöffnet.

                  MfG Nicole

                  1. htp.p('Content-Type: text/xml');

                    So okay, das Problem ist behoben
                    muss heißen:

                    htp.p('Content-Type: text/xml');
                    htp.p('');

                    --- ich weiß zwar nicht warum aber so funktioniert es.
                    Und endlich kann ich auch auf die Knoten zugreifen.

                    Vielen lieben Dank euch allen,
                    ohne euch hätte ich das Problem in hundert Jahren nicht gelöst.

                  2. Hallo,

                    der Fehler lautet "End of headers not found!"...
                    ich habe keine Ahnung wie ich den Header abschließen soll, schließlich habe ich ihn ja nicht explizit geöffnet.

                    Der Header "Content-Type: text/xml" ist richtig.

                    Mit der PL/SQL-Syntax kenne ich mich nicht aus, vielleicht hilft dieser Export-Code.

                    Alternativ gibt es noch die Moeglichkeit, clientseitig mit der Methode overrideMimeType("text/xml") zu arbeiten, die der IE allerdings nicht kennt.

                    MfG, Thomas

          2. Hallo,

            Also wenn ich documentElement einfüge kommt:

            bei var xmlDocument = http.responseXML.documentElement;
            im IE der Fehler "null" ist Null oder keine Objekt

            Dann stimmt generell etwas nicht. Hier mal ein Test, der mit und ohne documentElement funktioniert (IE 5.5 / 6.0, FF 1.5, OP 8.5 / 9.0 TP1).

            Das geladene XML-Dokument ajaxtest.xml:

              
            <?xml version="1.0" encoding="ISO-8859-1"?>  
            <bla>  
              <blub>1</blub>  
              <blub>2</blub>  
              <blub>3</blub>  
            </bla>
            

            oder bei alert(xmlDocument.documentElement.getElementsByTagName('result').length);
            im IE der Fehler "documentElement" ist Null oder kein Objekt.

            Vermutlich wird der Code gar nicht im HTTP-Kontext ausgefuehrt?

            Den Zugriff ueber documentElement habe ich uebrigens explizit beim Arbeiten mit SVG [Beispiel], also im unmittelbaren XML-Umfeld benoetigt [sowohl mit ASV + getURL() als auch mit FF 1.5 + XMLHttpRequest()].

            MfG, Thomas