views:

169

answers:

1

I'm trying to create an itunes-valid podcast feed using php5's simplexml:

<?php   
$xml_string = <<<XML
<?xml version="1.0" encoding="UTF-8"?>


<channel>
</channel>
XML;

$xml_generator = new SimpleXMLElement($xml_string);
           $tnsoundfile = $xml_generator->addChild('title', 'Main Title');
           $tnsoundfile->addChild('itunes:author', "Author", ' ');
           $tnsoundfile->addChild('category', 'Audio Podcasts'); 
           $tnsoundfile = $xml_generator->addChild('item');
           $tnsoundfile->addChild('title', 'The track title');        
           $enclosure = $tnsoundfile->addChild('enclosure');
           $enclosure->addAttribute('url', 'http://test.com');
           $enclosure->addAttribute('length', 'filelength');
           $enclosure->addAttribute('type', 'audio/mpeg');       
           $tnsoundfile->addChild('itunes:author', "Author", ' '); 


header("Content-Type: text/xml");
echo $xml_generator->asXML();

?>

It doesn't validate, because I've got to put the line:

<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">

as per http://www.apple.com/itunes/podcasts/specs.html.

So the output SHOULD be:

<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
<channel>

etc. I've been over and over the manual and forums, just can't get it right. If I put, near the footer:

header("Content-Type: text/xml");
echo '<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">';
echo $xml_generator->asXML();
?>

Then it sort of looks right in firefox and it doesn't complain about undefined namespaces anymore, but feedvalidator complains that

line 1, column 77: XML parsing error: :1:77: xml declaration not at start of external entity [help]

because the document now starts:

<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"><?xml version="1.0" encoding="UTF-8"?>

and not

<?xml version="1.0" encoding="UTF-8"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">

Thank you in advance.

A: 

After 5 nights, as many forums, and two php developing friends, it appears that actually, php simplexml isn't capable of producing an itunes-store-compliant podcast as specced at: http://www.apple.com/itunes/podcasts/specs.html

So, here's the workaround:

$xml_result = $xml_generator->asXML();
$xml_LeftHandSide = '<?xml version="1.0" encoding="UTF-8"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">';
$xml_RightHandSide = substr($xml_result, 22);
echo $xml_LeftHandSide . $xml_RightHandSide . "</rss>";
talkingnews