Ende Juli hatte ich einen ersten RSS-Feed für die Webnotizen erstellt, den ich allerdings noch manuell ändern musste. Ein PHP-Script war schnell geschrieben, nur musste ich noch ein paar knifflige Detailfragen lösen, damit das Script funktioniert und valide ist.
PHP in .xml
Die Adresse des alten Feeds http://notizen.joergkrusesweb.de/feeds/rss-1-0.xml wollte ich beibehalten, darunter haben ihn schließlich schon einige Besucher abonniert. In einer .htaccess in dem entsprechenden Verzeichnis habe ich dem Server mitgeteilt, dass er auch .xml-Dateien durch den PHP-Parser schickt:
AddType x-mapp-php4 .xml
Falls die .htaccess in dieser Form nicht den gewünschten Effekt zeigt, sollte man es stattdessen mit folgender Zeile versuchen:
AddType application/x-httpd-php .xml
Keine HTML Entities in XML
Die Titel und Beschreibungen der Webnotizen sind in der Datenbank so abgelegt, dass sie ohne weitere Verarbeitung in den HTML-Seiten ausgegeben werden können; so werden z.B. Umlaute und das ß mithilfe der Funktion htmlentities() vor dem Einlesen in die Datenbank als ä - ö - ü - ß maskiert. Diese HTML Entities sind allerdings nicht XML-konform, so dass ich in dem Feed-Script die Maskierung wieder rückgängig machen muss; dies lässt sich ab PHP 4.3.0 mit der Funktion html_entity_decode() bewerkstelligen.
$title = html_entity_decode($title);
Content Type und Charset
Das Feed war nun zwar valide, aber der Validator gab als Warnung aus, dass Charset im Feed und im HTTP Header nicht übereinstimmten und dass der im Header angegebene Content-Type falsch ist (ein übrigens weiterverbreitetes Problem: Fast die Hälfte der RSS-Feeds ist ungültig). Mit der PHP-Funktion header() (die noch vor der XML-Deklaration platziert wird) wird eine Übereinstimmung herbeigeführt, und der Content-Type richtig als text/xml angegeben:
header('Content-Type: text/xml; charset=iso-8859-1');
Danach war das Feed nicht nur valide, auch die Header-Angaben stimmten.