将rss xmlns命名空间定义添加到php simplexml文档中?

时间:2010-04-15 09:58:39

标签: php xml simplexml itunes

我正在尝试使用php5的simplexml创建一个itunes有效的播客源:

<?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();

?>

它没有验证,因为我必须把这行:

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

根据http://www.apple.com/itunes/podcasts/specs.html

所以输出应该是:

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

等。我一直在手册和论坛上,只是无法做到正确。如果我放在靠近页脚的地方:

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();
?>

然后它在Firefox中看起来很正常,它不再抱怨未定义的命名空间,但是feedvalidator抱怨

  

第1行,第77列:XML解析错误:   :1:77:xml声明不在   外部实体的开始[帮助]

因为文档现在开始了:

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

而不是

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

2 个答案:

答案 0 :(得分:3)

问题中显示的代码不起作用,因为它没有使用正确的命名空间。具体来说,这些行:

$tnsoundfile->addChild('itunes:author', "Author", ' ');

他们将在“”(一个空格)命名空间中创建一个<author/>节点,这显然是不正确的。它应该是:

$tnsoundfile->addChild('itunes:author', "Author", 'http://www.itunes.com/dtds/podcast-1.0.dtd');

这是使用命名空间的正确方法。

答案 1 :(得分:2)

使用SimpleXML非常有用。只需在构造函数字符串中声明名称空间,而不是属性。

$rss_xml = new SimpleXMLElement(
   '<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"/>');
$rss_xml->addAttribute('version', '2.0');