2010-04-15 82 views
2

我試圖使用PHP5的SimpleXML創造了iTunes播客的有效進:將rss xmlns命名空間定義添加到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(); 

?> 

它不驗證,因爲我得放線:

<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,並沒有抱怨未定義的命名空間了,但供稿驗證抱怨

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

因爲文檔現在開始:

<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

這對SimpleXML來說非常有可能。只需在構造函數字符串中聲明名稱空間,而不是作爲屬性。

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

在不起作用的問題,因爲它沒有使用正確的命名空間中的代碼。特別是,這些行:

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

他們將創建在「」(一個空格)命名空間,這顯然是不正確的<author/>節點。它應顯示爲:

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

這是使用命名空間的正確方法。

相關問題