2010-04-15 4 views
2

Je suis en train de créer un flux podcast itunes valide en utilisant le simplexml de php5:Ajouter une définition d'espace de noms rss xmlns à un document php 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(); 

?> 

Il ne valide pas, parce que je dois mettre la ligne:

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

selon http://www.apple.com/itunes/podcasts/specs.html.

Ainsi, la sortie doit être:

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

etc. Je suis encore et le manuel et les forums, ne peuvent tout simplement pas faire les choses. Si je mets, à proximité du pied de page:

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

Ensuite, il semble sorte de droit dans Firefox et il ne se plaint pas namespaces indéfinis plus, mais feedvalidator se plaint que

line 1, column 77: XML parsing error: :1:77: xml declaration not at start of external entity [help]

parce que le document commence maintenant :

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

et non

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

Répondre

2

C'est très possible avec SimpleXML. Déclarez juste l'espace de noms dans la chaîne de constructeur, pas comme un attribut.

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

Le code indiqué dans la question ne fonctionne pas car il n'utilise pas l'espace de noms correct. Plus précisément, ces lignes:

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

Ils vont créer un nœud <author/> dans l'espace de noms « » (un espace), ce qui est évidemment incorrect. Il devrait être:

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

Ceci est la manière correcte d'utiliser les espaces de noms.

Questions connexes