Add rss xmlns namespace definition to a php simplexml document?
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->as开发者_运维知识库XML();
?>
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">
The code in shown in the question doesn't work because it doesn't use the correct namespace. Specifically, these lines:
$tnsoundfile->addChild('itunes:author', "Author", ' ');
They will create an <author/>
node in the " " (one space) namespace, which is obviously incorrect. It should read:
$tnsoundfile->addChild('itunes:author', "Author", 'http://www.itunes.com/dtds/podcast-1.0.dtd');
This is the correct way to use namespaces.
This is very much possible with SimpleXML. Just declare the namespace within the constructor string, not as an attribute.
$rss_xml = new SimpleXMLElement(
'<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"/>');
$rss_xml->addAttribute('version', '2.0');
精彩评论