Design für Print und Web

RSS-Newsfeed mit DOM XML

01.05.2006 um 10:54 Uhr
Emersacker
abgelegt unter PHP

Emersacker. Gestern, am 30. April. habe ich endlich mein RSS-Newsfeed installiert, davor hatte ich jede Menge Ärger mit der dynamischen Erzeugung der XML-Datei.

Was so in keinem Handbuch stand: die DOM XML Funktionen wollen mit in UTF-8 kodierten Zeichenketten gefüttert werden - deutsche Umlaute, bestimmte Arten von Leerzeichen!!! oder escapte HTML-Entities führen unweigerlich zu Fehlern bei der Verarbeitung, das Schreiben in Datei mit dump_file() scheitert unweigerlich.:-(

Damit es rund läuft bei der Verarbeitung sollte man intelligenten Gebrauch von den eingebauten Funktionen html_entity_decode() und utf8_encode() machen, siehe Beispiel unten.

So bekommt man eine Datei serviert, die auch den Ansprüchen des Feedvalidators vollkommen genügt.:-)

Code Listing:

  • Listing 1: domxml_test2.php
    <?php
    error_reporting
    (E_ALL);

    if(!
    function_exists('domxml_new_doc')) {
        die(
    'Die Funktion domxml_new_doc wird benoetigt, ist in dieser PHP-Kompilierung aber nicht vorhanden!');
    }


    // Dateiname etc. festlegen: 
    $path 'http://pfadangabe';
    $filename 'feedname.xml'
    $url "$path/$filename"
    $rss_title 'rger mit Umlauten &amp; HTML-Entities'

    // XML_Dokument erzeugen: 
    $xml domxml_new_doc('1.0'); 
    $RDF $xml->create_element('rdf:RDF'); 
    $xml->append_child($RDF); 
    $RDF->set_attribute(' xmlns:rdf' ,'http://www.w3.org/1999/02/22-rdf-syntax-ns#'); 
    $RDF->set_attribute(' xmlns' ,'http://purl.org/rss/1.0/'); 

    $channel $xml->create_element('channel'); 
    $channel->set_attribute('rdf:about'$url); 
    $RDF->append_child($channel); 

    $title $xml->create_element('title'); 
    $title->append_child($xml->create_text_node(utf8_encode(html_entity_decode($rss_title)))); 
    $channel->append_child($title); 
    // u.s.w. ... habe ich mal weggelassen, weil's sonst 
    // zu lang wird... 

    // Kontrollausgabe:
    echo '<pre>',htmlentities($xml->dump_mem(true)),'</pre>'


    // Schreibe erzeugtes Dokument in Datei: 
    #$xml->dump_file($filename,false,true); 

    ?>

    domxml_test2.php (1,2 KB): Beispiel aufrufen

Kommentar: 1
  • 1 Michael Daum 03.05.2006 um 18:39 Uhr

    Das säubern geht auch noch kürzer:

    $xmlstr = html_entity_decode( $xmlstr, ENT_NOQUOTES, "UTF-8");

    Michael :-)