Jump to content

Add itunes rss xmlns namespace definition to a php simplexml document?


digitaltoast

Recommended Posts

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: <unknown>:1:77: xml declaration not at start of external entity

 

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">

 

Any ideas gratefully received! Thank you.

Well, the conclusion is that 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>";

 

et voila! feedvalidator and itunes are happy :)

 

Wish I'd thought of this 5 nights ago...

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.