[[webdev:php:podcast-mit-simplexmlelement]]

Podcast erstellen mit SimpleXMLElement

Ein Podcast mit PHP zu erstellen kann so simpel sein, wie die Klasse SimpleXMLElement sich selbst nennt. Folgend ein Beispiel, wo aber nicht alle Tags berücksichtigt wurden, die von Apple spezifiziert sind; Weiter unten gibt es ein erweitertes Beispiel mit Itunes spezifischen Tags. Die Kodierung spezieller Zeichen in Child und Attribute übernimmt simpleXMLElement::asXML(), daher ist in diesem Beispiel die Funktion htmlspecialchars nicht nötig - Verlassen kann man sich aber nicht darauf, wenn zum Beispiel HTML-Code geliefert wird.

simplexmlelement.podcast.php
<?php
/* podcast mit simpleXMLElement */
 
// beispiel datensatz
$data = array("http://example.com/1.mp3","http://example.com/2.mp3");
 
$xml = new SimpleXMLElement('<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"></rss>');
 
$channel = $xml->addChild("channel");
    $channel->addChild("title","Mein Podcast");
    $channel->addChild("link","http://example.com/podcast");
    $channel->addChild("language","de-de");
    $channel->addChild("copyright","meine Lizenz");
 
foreach ( $data as $item ) {
 
    $items = $channel->addChild("item");
        $items->addChild("title",$item);
        $items->addChild("link","http://example.com/podcast/item/");
        $items->addChild("description","Ein neuer Podcast: ".$item);
        $items->addChild("pubDate",date("D, d M Y H:i:s O",time()));
 
        $enclosure = $items->addChild("enclosure");
            $enclosure->addAttribute("url",$item);
            $enclosure->addAttribute("type","audio/x-mp3");
 
}
 
 
// und abschicken
header("Content-Type: text/xml");
 
print $xml->asXML();
 
 
?>

asXml() formatiert die Ausgabe nicht, ich habe mich einem Plugin für Notepad++ bedient; es gibt aber in den Comments Hinweise dazu, zb prettyprint. Ausgabe:

<?xml version="1.0"?>
<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
	<channel>
		<title>Mein Podcast</title>
		<link>http://example.com/podcast</link>
		<language>de-de</language>
		<copyright>meine Lizenz</copyright>
		<item>
			<title>http://example.com/1.mp3</title>
			<link>http://example.com/podcast/item/1</link>
			<description>Ein neuer Podcast: http://example.com/1.mp3</description>
			<pubDate>Sat, 16 Oct 2010 14:46:55 +0200</pubDate>
			<enclosure url="http://example.com/1.mp3" type="audio/x-mp3"/>
		</item>
		<item>
			<title>http://example.com/2.mp3</title>
			<link>http://example.com/podcast/item/2</link>
			<description>Ein neuer Podcast: http://example.com/2.mp3</description>
			<pubDate>Sat, 16 Oct 2010 14:46:55 +0200</pubDate>
			<enclosure url="http://example.com/2.mp3" type="audio/x-mp3"/>
		</item>
	</channel>
</rss>
// Wenn man Namespaces zum übergeordneten Element hinzufügt, muss es explizit auf die NS-URI verweisen, zu dessen es gehört.
 
$ns = "http://www.itunes.com/dtds/podcast-1.0.dtd";
        $xml = new SimpleXMLElement('<rss xmlns:itunes="'.$ns.'" version="2.0"></rss>');
        $channel = $xml->addChild("channel");
        $channel->addChild("title","Mein Podcast");
        $channel->addChild("link","http://example.com/podcast");
        $channel->addChild("language","de-de");
        $channel->addChild("copyright","cc3.0");
        $channel->addChild("itunes:image", null,$ns)->addAttribute("href","http://example.com/bild.png");
        $channel->addChild("itunes:category", null,$ns)->addAttribute("text","Music");
        $channel->addChild("itunes:subtitle","Mein Podcast mit Nerdnews",$ns);
        $channel->addChild("itunes:author","Mein Name",$ns); 
        foreach ( $data as $item ) {
 
            $items = $channel->addChild("item");
            $items->addChild("title",$item["title"]);
            $items->addChild("link",$item["link"]);
            $items->addChild("description",htmlspecialchars($item["description"]));
            $items->addChild("pubDate",date("D, d M Y H:i:s O",strtotime($item["pubDate"])));
            $items->addChild("itunes:keywords",$item["keywords"],$ns);
 
            $enclosure = $items->addChild("enclosure");
            $enclosure->addAttribute("url",$item["url"]);
            $enclosure->addAttribute("type","audio/x-mp3");
 
        }
        // und abschicken
        // und abschicken
        header("Content-Type: text/xml");
        print $xml->asXML();

Ausgabe:

<?xml version="1.0"?>
<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
	<channel>
		<title>Haiko Hall Podcast</title>
		<link>http://datenfahrt.de/haikohall</link>
		<language>de-de</language>
		<copyright>cc3.0</copyright>
		<itunes:image href="http://example.com/image.png"/>
		<itunes:category text="Music"/>
		<itunes:subtitle>Tanzmusik from Berlin</itunes:subtitle>
		<itunes:author>Haiko Hall</itunes:author>
		<item>
			<title>Tanz in die Mitte</title>
			<link>http:/example.com/item/15</link>
			<description>Neuer Podcast aus Berlin-Mitte</description>
			<pubDate>Wed, 13 Oct 2010 21:41:28 +0200</pubDate>
			<itunes:keywords>podcast,techno,berlin</itunes:keywords>
			<enclosure url="http://example.com/podcast10210.mp3" type="audio/x-mp3"/>
		</item>
</channel>
</rss>
Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden. Weitere Information
  • webdev/php/podcast-mit-simplexmlelement.txt
  • Zuletzt geändert: 2012/07/10 07:37
  • (Externe Bearbeitung)