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