SimpleXMLElement Error

teccrow

Grünschnabel
Hallo Community,

ich habe schon einige Seiten nach einer Lösung durchsucht, konnte aber bisher keine Lösung finden.

Mit folgendem php-Script-Teil lese ich mehrere XML-Dateien aus:
Code:
$cacheDatei = "cache/" . $test . "_rss.xml.cache";
$fileContent = file_get_contents($cacheDatei);
$xml = new SimpleXMLElement($fileContent);
$quelle = $xml->channel;
var_dump ($quelle);

Dies klappt auch alles wunderbar, nur bei einer Datei kommt die Fehlermeldung:

Code:
Warning: SimpleXMLElement::__construct(): Entity: line 4: parser error : EntityRef: expecting ';' in D:\Programme\xampp\htdocs\VG\iframe\rss\rssCache_test.php on line 24

Warning: SimpleXMLElement::__construct(): <title>MIT News - Topic - Innovation and Entrepreneurship (I&E)</title> in D:\Programme\xampp\htdocs\VG\iframe\rss\rssCache_test.php on line 24

Warning: SimpleXMLElement::__construct(): ^ in D:\Programme\xampp\htdocs\VG\iframe\rss\rssCache_test.php on line 24

Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' in D:\Programme\xampp\htdocs\VG\iframe\rss\rssCache_test.php:24 Stack trace: #0 D:\Programme\xampp\htdocs\VG\iframe\rss\rssCache_test.php(24): SimpleXMLElement->__construct('<?xml version="...') #1 {main} thrown in D:\Programme\xampp\htdocs\VG\iframe\rss\rssCache_test.php on line 24

Hier die entsprechende XML-Datei:
Code:
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:story="http://web.mit.edu/newsoffice/ns/" xmlns:media="http://search.yahoo.com/mrss/">
	<channel>
		<title>MIT News - Topic - Innovation and Entrepreneurship (I&E)</title>
		<description>MIT News is dedicated to communicating to the media and the public the news and achievements of the students, faculty, staff and the greater MIT community.</description>
		<link>http://web.mit.edu/newsoffice/topic/innovation.html</link>
		<atom:link rel="self" href="http://web.mit.edu/newsoffice/topic/innovation.html" />
		<lastBuildDate>Thu, 23 Jan 2014 13:48:34 +0000</lastBuildDate>
		<language>en-us</language>

Bei meinen Versuchen habe ich festgestellt, dass das "&" im tiltle-Tag das Problem verursacht. Da ich keinen Einfluss auf die XML-Datei, muss ich das irgendwie umgehen.

Aber wie? Weiß jemand eine Lösung?
 
Hi,

tja, das XML ist wie du schon vermutest hast ungültig / nicht wohlgeformt.
Du musst das XML erst mal in eine gültige Form bringen, damit du es parsen kannst, soweit ich weiß ist das SimpleXML da sehr empfindlich.

Hier zum Beispiel einen RegEx mit dem du das einfache "&" fixen kannst: (Ungetestet, als Ansatz)
PHP:
$fileContent = file_get_contents($cacheDatei);
$fileContent = preg_replace('#&([^;]+)<#', '&amp;\\1<', $fileContent)
$xml = new SimpleXMLElement($fileContent);

Grüße,
BK
 
Zuletzt bearbeitet:
Zurück