Zur Navigation

XML-Node mit Wert null mit Mozilla erkennen

1 Andreas

Ich habe ein XML-Dokument mittels Javascript geparst und die Werte der Nodes (XML-Dokument[0].childNodes[Variable].firstChild.data) in ein Array geschrieben. Das XML-Dokument ist so strukturiert, dass es auch Kinder gibt, die Kinder haben. In diesem Fall ist der Wert des Nodes, unter dem ein weiterer Node untergeordnet ist, nichts, also "null". Mit dem IE klappt die Behandlung prima, nicht jedoch mit dem Mozilla: Mozilla ist wohl der Meinung, dass "nichts" nicht "nichts" ist.

Hier ein Bespiel des Inhalts des Arrays (Ausgabe lt. Browser):

IE: A,B,C,D,,F,,H,I
Mozilla: A,B,C,D, ,F, ,H,I


Wenn ich also auf "null" prüfe, meint Mozilla es gibt keinen Datensatz - der IE meldet ihn korrekt als "leer".

Wie kann man Mozilla dazu veranlassen, leere Datensätze korrekt als leer zu erkennen?

21.11.2009 18:34

2 Jörg Kruse

Wie schaut das XML-File denn konkret aus?

Der Node "bar" im folgenden Codeblock ist beispielsweise nicht leer, da zwischen den Tags Leerzeichen und ein Zeilenumbruch enthalten sind:

<foo>
    <bar>
    </bar>
</foo>

21.11.2009 19:27

3 Andreas

In etwa so:

<foo>
   <bar1>Wert-A</bar1>
   <bar2>Wert-B</bar2>
   <bar3>
      <bar3a>Wert-CA</bar3a>
   </bar3>
   <bar4>Wert-D</bar4>
</foo>

In diesem Fall ist <bar3> leer.

21.11.2009 19:40

4 Jörg Kruse

Nein, <bar3> enthält mehrere Leerzeichen zum Einrücken des Codes (hier durch Punkte dargestellt):

   <bar3>
...<bar3a>Wert-CA</bar3a>
...</bar3>

21.11.2009 19:58 | geändert: 21.11.2009 19:59

5 Andreas

Hm ... das ist hier der Tatsache geschuldet, dass ich nicht mit Tabs arbeiten kann. Tatsächlich sind natürlich Tabstopps anstatt Leerzeichen vorhanden.

Aber noch ein HInweis: Wie im ersten Posting dargestellt, scheint Mozilla irgendwas in den vermeintlich leeren Datensatz zu schreiben. Aber was?

22.11.2009 09:42 | geändert: 22.11.2009 09:42

6 Andreas

OK, der Hinweis auf Leerzeichen o.ä. war korrekt - ich hatte mir schon so etwas gedacht. Ich habe mal den Inhalt der Datensätze escaped ausgegeben und festgestellt, dass da so lustige Dinge wie "%0A%20%20%20%20%20" enthalten sind. Interessant ist dabei, dass abhängig von der Position des Nodes mit Kindern unterschiedlich viele "%20" im Datensatz sind.

Die Lösung ist nicht sonderlich elegant:

if (XML-Daten[Variable] == null || XML-Daten[Variable].indexOf(unescape('%0A%20%20%20%20%20')) == 0)

Damit funktioniert die Prüfung auf (vermeintlich) leere Datensätze sowohl mit dem IE als auch Mozilla.

Die Kür wäre natürlich, wenn man prüfen würde, ob der entsprechende Datensatz immer mit "%0A" beginnt und ansonsten nur aus "%20" besteht. Zusätzlich müsste man natürlich prüfen, ob es sich bei dem entsprechenden Node um einen Node mit Kindern handelt - theoretisch wäre ja denkbar, dass ein regulärer Node auch diesen Inhalt hat.

Aber OK, vielen Dank für den Denkanstoß :-)

22.11.2009 10:23

7 Jörg Kruse

"%0A" repräsentiert den Zeilenumbruch, "20%" ein Leerzeichen. Wenn du zweimal einrückst, hast du vermutlich doppelt soviele "20%". Du könntest zum Vergleich den jeweiligen String "trimmen", d.h. die Whitespaces (Leerzeichen, Tabstopp, Zeilenumbruch) am Anfang und Ende des Strings entfernen. In PHP gibt es hierfür die Funktion trim(), in JavaScript kann man sich so eine Funktion sebst erstellen, wie z.B. hier (über Google gefunden, ungetestet)

theoretisch wäre ja denkbar, dass ein regulärer Node auch diesen Inhalt hat

Genau deswegen entfernen Mozilla Firefox, Opera und auch Google Chrome die Whitespaces hier nicht.

22.11.2009 10:32 | geändert: 22.11.2009 10:33

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]