我正在尝试使用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">
答案 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');