Javascript Fehler in IE 7 bei xml-Import

eikito

Grünschnabel
Hallo zusammen,
ich dachte ich hätte den vielleicht richtigen thread auf meine Frage schon gefunden, aber dem war wohl nicht so. Im FF läuft mein Script wunderbar, Daten werden angezeigt, der IE (6,7) zeigt leider keine Werte an. KAnn es sein, das javascript in IE anders parst?
Falls mir jemand auf die Sprünge helfen kann ... wäre toll!

Hier mein Script:

Code:
<script type="text/javascript">

o = null;

if(window.XMLHttpRequest)
{
 o = new XMLHttpRequest();
}
else if(window.ActiveXObject)
{
 try
 {
  o = new ActiveXObject('Msxml2.XMLHTTP');
 }
 catch(e1)
 {
  try
  {
   o = new ActiveXObject('Microsoft.XMLHTTP');
  }
  catch(e2)
  {
  }
 }
}

function xml_checken()
{
 if(o.readyState == 4 && o.status == 200)
 {
  // document.writeln(o.responseText); // Daten werden im IE ausgegeben!
 }
}

if(o != null)
{
 o.open('GET','CountryPricexml.xml',false);
 o.onreadystatechange = xml_checken;
 o.send(null);
}

x = o.responseXML.documentElement;
var ergebnisse = x.getElementsByTagName("FuelType");
// Folgende Zeile wird angemeckert:
var datum = ergebnisse[0].childNodes[9].firstChild.nodeValue.split("-"); 
var datum_display = ('Datum: '+datum[0]+ '.' +datum[1]+ '.20' +datum[2]+'<br>');

var display_content_1 = (ergebnisse[0].childNodes[13].childNodes[1].childNodes[1].firstChild.nodeValue + ' Preis: ' + ergebnisse[0].childNodes[1].firstChild.nodeValue + ' - ' + ergebnisse[1].childNodes[13].childNodes[1].childNodes[1].firstChild.nodeValue + ' Preis: ' + ergebnisse[1].childNodes[1].firstChild.nodeValue);

var display_content_2 = (ergebnisse[2].childNodes[13].childNodes[1].childNodes[1].firstChild.nodeValue + ' Preis: ' + ergebnisse[2].childNodes[1].firstChild.nodeValue + ' - ' + ergebnisse[3].childNodes[13].childNodes[1].childNodes[1].firstChild.nodeValue + ' Preis: ' + ergebnisse[3].childNodes[1].firstChild.nodeValue);

var display_content_3 = (ergebnisse[4].childNodes[13].childNodes[1].childNodes[1].firstChild.nodeValue + ' Preis: ' + ergebnisse[4].childNodes[1].firstChild.nodeValue + ' - ' + ergebnisse[5].childNodes[13].childNodes[1].childNodes[1].firstChild.nodeValue + ' Preis: ' + ergebnisse[5].childNodes[1].firstChild.nodeValue);

var display_test = (ergebnisse[1].childNodes[1].firstChild.nodeValue.length);
var display_ganzzahl = ergebnisse[1].childNodes[1].firstChild.nodeValue;

function Digitalzahl(zahl,name) {
		name = name.replace(/ /g, "_");
		name = ('<img style="margin-left:14px;" src="img/' + name + '.png" />')
	if (zahl.length == 5) {
		zahl1 = zahl.slice(0,zahl.length-4);
		zahl1 = ('<img src="img/' + zahl1 + '.png" />')
		zahl2 = zahl.slice(1,zahl.length-3);
		zahl2 = ('<img style="margin-left:8px;" src="img/' + zahl2 + '.png" />')
		zahl3 = zahl.slice(2,zahl.length-2);
		zahl3 = ('<img style="margin-left:7px;" src="img/' + zahl3 + '.png" />')
		zahl4 = zahl.slice(4,zahl.length-0);
		zahl4 = ('<img style="margin-left:6px; margin-right:7px;" src="img/s' + zahl4 + '.png" />')
		document.writeln(name+zahl1+zahl2+zahl3+zahl4);
	}
	if (zahl.length == 4) {
		zahl1 = 0;
		zahl2 = zahl.slice(0,zahl.length-3);
		zahl3 = zahl.slice(1,zahl.length-2);
		zahl4 = zahl.slice(3,zahl.length-0);
		document.writeln(zahl1+zahl2+zahl3+zahl4);
	}
}

var Begriff = ergebnisse[1].childNodes[1].firstChild.nodeValue;
var Extrakt = Begriff.slice(display_test-1);

</script>

</head>
<body>

<div class="display">
<div class="datum_display">
<script type="text/javascript">
document.writeln(datum_display);
</script>
</div>
<div class="display_numbers" id="eins" style="position:z-index:3;">
<script type="text/javascript">
	// Folgende Zeile wird angemeckert:
	Digitalzahl(ergebnisse[0].childNodes[1].firstChild.nodeValue, ergebnisse[0].childNodes[13].childNodes[1].childNodes[1].firstChild.nodeValue);
	Digitalzahl(ergebnisse[1].childNodes[1].firstChild.nodeValue, ergebnisse[1].childNodes[13].childNodes[1].childNodes[1].firstChild.nodeValue);
	</script>
</div>
<div class="display_numbers" id="zwei" style="z-index:2;">
<script type="text/javascript">
	// Folgende Zeile wird angemeckert:
	Digitalzahl(ergebnisse[2].childNodes[1].firstChild.nodeValue, ergebnisse[2].childNodes[13].childNodes[1].childNodes[1].firstChild.nodeValue);
	Digitalzahl(ergebnisse[3].childNodes[1].firstChild.nodeValue, ergebnisse[3].childNodes[13].childNodes[1].childNodes[1].firstChild.nodeValue);
	</script>
</div>
<div class="display_numbers" id="drei" style="z-index:1;">
<script type="text/javascript">
	// Folgende Zeile wird angemeckert:
	Digitalzahl(ergebnisse[4].childNodes[1].firstChild.nodeValue, ergebnisse[4].childNodes[13].childNodes[1].childNodes[1].firstChild.nodeValue);
	Digitalzahl(ergebnisse[5].childNodes[1].firstChild.nodeValue, ergebnisse[5].childNodes[13].childNodes[1].childNodes[1].firstChild.nodeValue);
	</script>
</div>
 
Moin,

hast du mal ein Beispiel für dein XML-Dokument parat?

Zu dem Unterschied: der IE geht anders mit Knoten um, er ignoriert Textknoten, welche nur aus Whitespaces bestehen, das könnte eine Ursache sein.
 
Oh ja, natürlich, hätte ich auch gleich posten können ... :rolleyes:

<?xml version="1.0" encoding="UTF-8"?>
<CountryFuelPrices xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<CountryFuelPrice id="13">
<Currencies>
<Currency>
<Symbol>EUR</Symbol>
<Name>Euro</Name>
<Default>Y</Default>
</Currency>
<Currency>
<Symbol>DM</Symbol>
<Name>Deutche Mark</Name>
<Default>N</Default>
</Currency>
</Currencies>
<FuelTypes>
<FuelType key="141">
<SellingPrice>119.8</SellingPrice>
<SellingPriceForMargin>119.9</SellingPriceForMargin>
<ProductPriceForMargin>32.1</ProductPriceForMargin>
<OtherSellingPrice>119.9</OtherSellingPrice>
<ModificationDate>22-NOV-06</ModificationDate>
<MarginCalculationDate>17-NOV-06</MarginCalculationDate>
<FuelTypeTranslations>
<FuelTypeTranslation homecategoryid="5005">
<FuelName>Benzin</FuelName>
<LocalFuelName>Benzin</LocalFuelName>
<Octane/>
</FuelTypeTranslation>
</FuelTypeTranslations>
<FuelTypeComponents>
<FuelTypeComponent id="1">
<ComponentType>value</ComponentType>
<ComponentValue>.5011</ComponentValue>
<FuelComponentTranslations>
<FuelComponentTranslation homecategoryid="5005">
<ComponentName>Mineralölsteuer</ComponentName>
</FuelComponentTranslation>
</FuelComponentTranslations>
</FuelTypeComponent>
<FuelTypeComponent id="2">
<ComponentType>value</ComponentType>
<ComponentValue>.1534</ComponentValue>
<FuelComponentTranslations>
<FuelComponentTranslation homecategoryid="5005">
<ComponentName>Ökosteuer</ComponentName>
</FuelComponentTranslation>
</FuelComponentTranslations>
</FuelTypeComponent>
<FuelTypeComponent id="3">
<ComponentType>value</ComponentType>
<ComponentValue>.0046</ComponentValue>
<FuelComponentTranslations>
<FuelComponentTranslation homecategoryid="5005">
<ComponentName>EBV</ComponentName>
</FuelComponentTranslation>
</FuelComponentTranslations>
</FuelTypeComponent>
<FuelTypeComponent id="4">
<ComponentType>percent</ComponentType>
<ComponentValue>16</ComponentValue>
<FuelComponentTranslations>
<FuelComponentTranslation homecategoryid="5005">
<ComponentName>MwSt.</ComponentName>
</FuelComponentTranslation>
</FuelComponentTranslations>
</FuelTypeComponent>
</FuelTypeComponents>
</FuelType>
<FuelType key="1040">
<SellingPrice>121.9</SellingPrice>
<SellingPriceForMargin>121.9</SellingPriceForMargin>
<ProductPriceForMargin>32.6</ProductPriceForMargin>
<OtherSellingPrice>121.9</OtherSellingPrice>
<ModificationDate>22-NOV-06</ModificationDate>
<MarginCalculationDate>17-NOV-06</MarginCalculationDate>
<FuelTypeTranslations>
<FuelTypeTranslation homecategoryid="5005">
<FuelName>Super</FuelName>
<LocalFuelName>Super</LocalFuelName>
<Octane/>
</FuelTypeTranslation>
</FuelTypeTranslations>
<FuelTypeComponents>
<FuelTypeComponent id="9">
<ComponentType>value</ComponentType>
<ComponentValue>.5011</ComponentValue>
<FuelComponentTranslations>
<FuelComponentTranslation homecategoryid="5005">
<ComponentName>Mineralölsteuer</ComponentName>
</FuelComponentTranslation>
</FuelComponentTranslations>
</FuelTypeComponent>
<FuelTypeComponent id="10">
<ComponentType>value</ComponentType>
<ComponentValue>.1534</ComponentValue>
<FuelComponentTranslations>
<FuelComponentTranslation homecategoryid="5005">
<ComponentName>Ökosteuer</ComponentName>
</FuelComponentTranslation>
</FuelComponentTranslations>
</FuelTypeComponent>
<FuelTypeComponent id="11">
<ComponentType>value</ComponentType>
<ComponentValue>.0046</ComponentValue>
<FuelComponentTranslations>
<FuelComponentTranslation homecategoryid="5005">
<ComponentName>EBV</ComponentName>
</FuelComponentTranslation>
</FuelComponentTranslations>
</FuelTypeComponent>
<FuelTypeComponent id="12">
<ComponentType>percent</ComponentType>
<ComponentValue>16</ComponentValue>
<FuelComponentTranslations>
<FuelComponentTranslation homecategoryid="5005">
<ComponentName>MwSt.</ComponentName>
</FuelComponentTranslation>
</FuelComponentTranslations>
</FuelTypeComponent>
</FuelTypeComponents>
</FuelType>
<FuelType key="1008">
<SellingPrice/>
<SellingPriceForMargin/>
<ProductPriceForMargin/>
<OtherSellingPrice/>
<ModificationDate/>
<MarginCalculationDate/>
<FuelTypeTranslations>
<FuelTypeTranslation homecategoryid="5005">
<FuelName>Verbleit</FuelName>
<LocalFuelName>Verbleit</LocalFuelName>
<Octane/>
</FuelTypeTranslation>
</FuelTypeTranslations>
<FuelTypeComponents/>
</FuelType>
</FuelTypes>
</CountryFuelPrice>
</CountryFuelPrices>
 
Jo, es scheint daran zu liegen, das Zählen des Index der childNodes-Collection führt je nach Browser zu anderen Ergebnissen.

Die Lösung ist aber recht simpel, und auch im Weiteren deiner Anwendung sehr von Vorteil :)

So, wie ein Document-Element, besitzen auch Element-Knoten eine Methode getElementsByTagName()

Du kannst damit also innerhalb eines Knotens anhand des tagNames komfortabel auf bestimmte Kindknoten zugreifen, ohne etwas zählen zu Müssen.

Bsp.:
Code:
var x = o.responseXML.documentElement;
var ergebnisse = x.getElementsByTagName("FuelType");
// Folgende Zeile wird nicht mehr angemeckert:
var datum = ergebnisse[0].getElementsByTagName('ModificationDate')[0].firstChild.nodeValue.split("-");

Das liefert dir aus dem 1. <FuelType> im Dokument den Inhalt des dazugehörigen <ModificationDate>-Kindknotens
 
Frohen Freitag :)
Jetzt frag ich mich nur, warum nach korrekter Änderung des Zugriffs auf die eingebetteten Werte meine Funktion Digitalzahl nicht mehr tut, was sie vorher tat. Nämlich funktionieren.

Unproblematische Ausgabe:
document.writeln(ergebnisse[0].getElementsByTagName('FuelName')[0].firstChild.nodeValue + ergebnisse[0].getElementsByTagName('SellingPrice')[0].firstChild.nodeValue);

Keine Ausgabe:
Digitalzahl(ergebnisse[0].getElementsByTagName('FuelName')[0].firstChild.nodeValue, ergebnisse[0].getElementsByTagName('SellingPrice')[0].firstChild.nodeValue);

Verhält sich getElementsByTagName() innerhalb von Funktionen anders?
Vielen Dank im voraus für eine rettende Antwort!

edit

Stop! Hab den Fehler gleich nach versenden des letzten Beitrags gefunden. Werte vertauscht. Sorry! Schönen Tag in die Runde :)
 
Deine Funktion Digitalzahl tut etwas, wenn der übergebene Parameter zahl eine length-Eigenschaft mit dem Wert 4 oder 5 hat.

Du übergibst da mit
Code:
ergebnisse[0].getElementsByTagName('FuelName')[0].firstChild.nodeValue
..den String Benzin.

Dieser hat eine length-Eigenschaft von 6(weil er aus 6 Buchstaben besteht)...folglich macht die Funktion da nichts.

<edit> zu spät gestoppt </edit> :-)
 

Neue Beiträge

Zurück