PHP: SimpleXML-Tipp um Ausgabefehler frühzeitig zu vermeiden

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