Michael Hein: Fehlermeldung bei Zugriff auf xml-Datei

Hallo @ll,

ich habe hier eine Problem welches ich schon in HTML-WORLD gepostet hatte zu dem mir da jedoch niemand helfen konnte.

Auf meiner Website www.wss-elbmarsch.de findet man unter dem Menüpunkt SBF-Binnen/Trainer/DEMO einen Aufruf eines sog. Trainers zur den Prüfungsfragen der entsprechenden Bootsführerscheine. So weit so gut.

Diese ca. 600 Fragen sind in einer xml-Datei hinterlegt und werden über die Menüpunkte z.Bsp. Allgemein (36) thematisch sortiert angezeigt. Die Antworten zu den Fragen werden über den Zeigen-Button angezeigt die Anzeige der nächsten Frage erreiche ich über den ok-Button.

Dies funktioniert einwandfrei, solange ich dieses System standalone bzw. als hta auf meinem Rechner betreibe. Nach dem Überspielen zu meinem Provider bekomme ich an der Stelle

<DIV ID="OutFrage" STYLE="position:absolute; top:60px; left:0px; visibility:visible">
 <SCRIPT LANGUAGE="JavaScript">
 <!--

var res = new String();
 var resFrage = new String();
 var FrageTab;

if (start != null)
 {
  switch (call)
  {
   case "?sbfb": FrageTab = document.getElementById('FragenSBFB'); break;  // Objektzeiger
   case "?sbfs": FrageTab = document.getElementById('FragenSBFS'); break;  // Objektzeiger
   case "?sks": FrageTab = document.getElementById('FragenSKS'); break;    // Objektzeiger
   case "?ubi": FrageTab = document.getElementById('FragenUBI'); break;    // Objektzeiger
   case "?src": FrageTab = document.getElementById('FragenSRC'); break;    // Objektzeiger
   case "?skn": FrageTab = document.getElementById('FragenSKN'); break;    // Objektzeiger
  }

// childNodes(Objektzeiger)
  var nummer, punkte, bogen, grafik, frage;

if (FrageTab.documentElement.childNodes(start) == null || top.demo == 'demo' && start == 5)
  {

alert("Die DEMO-Version endet hier.\n\nZum Erwerb der Vollversion setzen\nSie sich mit mir in Verbindung");
  }
  else
  {
   nummer = FrageTab.documentElement.childNodes(start).childNodes(0);
   punkte = FrageTab.documentElement.childNodes(start).childNodes(1);
   bogen = FrageTab.documentElement.childNodes(start).childNodes(2);
   grafik = FrageTab.documentElement.childNodes(start).childNodes(3);
   frage = FrageTab.documentElement.childNodes(start).childNodes(4);

resFrage += '<TABLE BORDER="0" WIDTH="300" CELLSPACING="5" CELLPADDING="0">';
   resFrage += '<TR>';
   resFrage += '<TD WIDTH="48">'+ nummer.text +'</TD>';
   resFrage += '<TD WIDTH="52">'+ punkte.text +'</TD>';
   resFrage += '<TD WIDTH="160">'+ bogen.text +'</TD>';
   resFrage += '</TR>';
   resFrage += '</TABLE>';
   resFrage += '<TABLE BORDER="0" WIDTH="300" CELLSPACING="5" CELLPADDING="0">';
   resFrage += '<TR>';
   resFrage += '<TD WIDTH="300" HEIGHT="80" VALIGN="top">'+ frage.text +'</TD>';
   resFrage += '</TR>';
   resFrage += '</TABLE>';

if(grafik.text == "")
   {
    parent.dd.elements.trainerGrafik.swapImage('transparentpixel.gif');
   }
   else
   {
    parent.dd.elements.trainerGrafik.swapImage(grafik.text);
    parent.dd.elements.trainerGrafik.setOpacity(0.8);
    parent.dd.elements.trainerGrafik.show();
   }
   document.open();
   document.write(resFrage);
   document.close();
  }
 }
 //-->
 </SCRIPT>
</DIV>

<DIV ID="Fest" STYLE="position:absolute; top:205px; left:0px; visibility:visible">
<TABLE BORDER="0" WIDTH="300" CELLSPACING="5" CELLPADDING="0">
 <TR>
 <TD><HR SIZE="0" WIDTH="290" COLOR="#00005d" noshade></HR></TD>
 </TR>
 <TR>
 <TD ALIGN="center"><A HREF="JavaScript:showAntwort()" onMouseOver="javascript:showImage('0','button1', 'b')" onMouseOut="javascript:showImage('0','button1', 'a')"><IMG SRC="../images/bZeigenOff.gif" WIDTH="90" HEIGHT="23" BORDER="0"></A></TD>
 </TR>
 <TR>
 <TD><HR SIZE="1" WIDTH="290" COLOR="#00005d" noshade></HR></TD>
 </TR>
</TABLE>
</DIV>

<DIV ID="OutAntwort" STYLE="position:absolute; top:270px; left:0px; visibility:hidden">
 <SCRIPT LANGUAGE="JavaScript">
 <!--

resAntwort = new String();

if (start != null)
 {
  // childNodes(Objektzeiger)
  var antwort;

antwort = FrageTab.documentElement.childNodes(start).childNodes(5);

resAntwort += '<TABLE BORDER="0" WIDTH="300" CELLSPACING="5" CELLPADDING="0"><TR>';
  resAntwort += '<TD HEIGHT="100" VALIGN="top">' + antwort.text + '</TD></TR>';
  resAntwort += '</TABLE>';

document.open();
  document.writeln(resAntwort);
  document.close();
 }

//-->
 </SCRIPT>
</DIV>

nummer = FrageTab.documentElement.childNodes(start).childNodes(0) die Fehlermeldung - FrageTab.documentElement ist null oder kein Object -

Ignoriere ich diese Fehlermeldung so liesst das System wenige Codezeilen später in DIV ID="OutAntwort" mit derselben Variablen FrageTab die Antwort aus der xml-Datei. Dies kann ich mir nicht erklären. Die Fehlermeldung kann ich auch dadurch verhindern, dass ich vor dem beanstandeten Befehl ein alert(FrageTab) einfüge. nach der Bestätigung im alert werden die folgenden Befehle ohne Beanstandungen ausgeführt.

Wer kann mir helfen ?

Mit freundlichen Grüßen

Michael Hein

  1. Nachtrag:

    Bisher funktioniert diese Website und die Anwendung nur unter MSie 6.0 zufriedenstellend. Ich bin noch am entwickeln.

    MfG

    Michael Hein

  2. Hallo,

    nummer = FrageTab.documentElement.childNodes(start).childNodes(0) die Fehlermeldung - FrageTab.documentElement ist null oder kein Object -

    Ignoriere ich diese Fehlermeldung so liesst das System wenige Codezeilen später in DIV ID="OutAntwort" mit derselben Variablen FrageTab die Antwort aus der xml-Datei. Dies kann ich mir nicht erklären. Die Fehlermeldung kann ich auch dadurch verhindern, dass ich vor dem beanstandeten Befehl ein alert(FrageTab) einfüge. nach der Bestätigung im alert werden die folgenden Befehle ohne Beanstandungen ausgeführt.

    Ich habe den Codewust nicht weiter analysiert, aber prinzipiell solltest du darauf achten, dass du auf eine XML Data Island erst zugreifst, wenn du dir sicher sein kannst, dass die Datei vollständig vom Server zum Client übertragen wurde.

    Da du mehrere große XML-Dateien einbindest, dauert es natürlich seine Zeit, bis die zum Client übertragen wurden. Wenn du direkt nach der Einbindung der XML-Datei darauf zugreifen willst, geht das natürlich nicht:

    <html>  
    <head>  
    <script type="text/javascript">  
    [code lang=javascript]window.onload = function () {  
     alert(xmlIsland.documentElement); // [object]  
    };
    

    </script>
    </head>
    <body>

    <xml id="data" src="data.xml"></xml>
    <script type="text/javascript">

    var xmlIsland = document.getElementById("data");  
    alert(xmlIsland.documentElement); // null
    

    </script>

    </body>
    </html>[/code]

    Erst beim onload kannst du dir sicher sein, dass alle Daten geladen wurden. Du müsstest also mit einer Bitte-Warten-Meldung starten, die beim onload ausgeblendet wird. Erst dann könnte deine Logik auf die Daten zugreifen. Alternativ gibt es den Handler ondataavailable, der allerdings jeweils nur auf ein xml-Element angewendet werden kann:

    <xml id="data" src="data.xml" ondataavailable="alert('Fertig')"></xml>

    Heutzutage nutzt man sowieso XMLHttpRequest für diese Zwecke. Über den readyState-Event lässt sich der Ladestatus einer XML-Ressource direkt überwachen. Außerdem besteht keine Notwendigkeit, das ganze auf IE zu fixieren.

    Mathias

    1. Hallo Matthias,

      vielen Dank für die schnelle Antwort.

      Ich habe den Codewust nicht weiter analysiert, aber prinzipiell solltest du darauf achten, dass du auf eine XML Data Island erst zugreifst, wenn du dir sicher sein kannst, dass die Datei vollständig vom Server zum Client übertragen wurde.

      Da du mehrere große XML-Dateien einbindest, dauert es natürlich seine Zeit, bis die zum Client übertragen wurden. Wenn du direkt nach der Einbindung der XML-Datei darauf zugreifen willst, geht das natürlich nicht:

      Das erklärt natürlich, dass die Fehlermeldung durch den alert verhindert wird und der zweite Zugriff ohne Fehler erfolgen kann.

      Über diese ondataavailable-Geschichte mus ich jetzt erstmal nachdenken, da dies bedeutet, dass ich das HTML neu strukturieren muss.

      Gruß

      Michael

      1. Hallo Mathias,

        beantworte doch bitte noch einige Fragen!

        Da du mehrere große XML-Dateien einbindest, dauert es natürlich seine Zeit, bis die zum Client übertragen wurden. Wenn du direkt nach der Einbindung der XML-Datei darauf zugreifen willst, geht das natürlich nicht:

        Die xml-Dateien werden im HEAD-Bereich des HTML-Documents eingebunden. Das verstehe ich so, das sie vor der Ausführung aller Functionen die im BODY des HTML-Documents stehen vorhanden sind. Der Zugriff auf diese Dateien erfolgt aber erst im BODY. Wenn dem nicht so wäre müsste doch schon die Zuweisung im switch fehlerhaft sein.

        DA ich nicht zu jedem Zeitpunkt Zugriff auf alle xml-Dateien benötige besteht irgendwie die Möglichkeit

        <xml src="FragenSBFB.xml" id="FragenSBFB"></XML> in Abhängigkeit von einem Übergabeparameter zu definieren.

        mit gruß vom

        Michael

        1. Hi,

          DA ich nicht zu jedem Zeitpunkt Zugriff auf alle xml-Dateien benötige besteht irgendwie die Möglichkeit

          <xml src="FragenSBFB.xml" id="FragenSBFB"></XML> in Abhängigkeit von einem Übergabeparameter zu definieren.

          Du solltest dich IMHO, wie bereits gesagt, wirklich einmal mit XMLHttpRequest (auch "Ajax" genannt) beschäftigen.

          Gruß, Cybaer

          --
          Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!