Vor kurzem hat sich Script von mir zerschossen, weil beim umwandeln einer XML-Datei in ein Objekt via simplexml_load_file() ein Fehler durch das BOM in der XML-Datei ausgelöst wurde.
Als Byte Order Mark (BOM, dt. „Bytereihenfolge-Markierung“) wird das Unicode-Zeichen U+FEFF (zero-width non-breaking space) am Anfang eines Datenstroms bezeichnet, wo es als Signatur zur Definition der Byte-Reihenfolge und Kodierungsform in UCS/Unicode-Zeichenketten verwendet wird. http://de.wikipedia.org/wiki/Byte_Order_Mark
Mein Script war zu diesem Zeitpunkt noch sehr fehleranfällig: Ich habe lediglich geprüft, ob die benötigte XML-Datei auf dem Server vorhanden ist und sie im Erfolgsfall mittels simplexml_load_file() als Objekt zurück geben lassen.
<?php $file = 'xml/data.xml'; if(file_exists($file)){ $xml = simplexml_load_file($file); $txt = $xml->screen->txt; } echo $txt; ?>Als Textdatei öffnen | since1985de_ef558f9b.txt | 185 Byte
Eine andere Lösung musste her.
Aber durch den vom BOM ausgelösten Fehler – der sich zwar durch manuelles entfernen beheben lassen würde – merkte ich, dass man, gerade wenn man keine Kontrolle über die XML-Dateien hat da sie von mehreren Anwendern bearbeitet werden, einen kleinen Umweg gehen muss. Der Inhalt der XML-Datei wird mittels file_get_contents() ausgelesen und per simplexml_load_string() als Objekt zurück geliefert. Außerdem wird das BOM durch die Funktion trim() entfernt und bei Bedarf ein Fehler ausgegeben.
<?php $file = 'xml/data.xml'; if(file_exists($file)){ $string = trim(file_get_contents($file)); $xml = simplexml_load_string($string); $txt = $xml->screen->txt; } else { $txt = 'Fehler: Ich konnte '.$file.' nicht finden.'; } echo $txt; ?>Als Textdatei öffnen | since1985de_8e8ccd83.txt | 298 Byte
Wenn man schon dabei ist …
Nachdem ich nun schon recht zufrieden mit dieser weniger fehleranfälligen Version meines Scripts war, habe ich mir noch gedacht, dass es vielleicht sinnvoll wäre neben der Existenz der XML-Datei auch noch zu prüfen, ob es sich bei dem zurück gelieferten Wert um en Objekt handelt.
<?php $file = 'xml/data.xml'; if(file_exists($file)){ $string = trim(file_get_contents($file)); $xml = simplexml_load_string($string); if(is_object($xml)){ $txt = $xml->screen->txt; } else { $txt = 'Fehler: Damit kann ich nicht arbeiten.'; } } else { $txt = 'Fehler: Ich konnte '.$file.' nicht finden.'; } echo $txt; ?>Als Textdatei öffnen | since1985de_c7ec04e2.txt | 389 Byte