Добавить определение пространства имен rss xmlns в документ php simplexml?

Я пытаюсь создать действующий в iTunes фид подкастов, используя simplexml php5:

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

person talkingnews    schedule 15.04.2010    source источник


Ответы (2)


Это очень возможно с SimpleXML. Просто объявите пространство имен в строке конструктора, а не как атрибут.

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

Код, показанный в вопросе, не работает, потому что он не использует правильное пространство имен. В частности, эти строки:

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

Они создадут узел <author/> в пространстве имен " " (один пробел), что явно неверно. Следует читать:

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

Это правильный способ использования пространств имен.

person Josh Davis    schedule 28.02.2011