2014-08-29 91 views
1

我尝试阅读我的iTunes RSS。我可以阅读标题,甚至是iTunes:副标题,但是我对标记图像有问题。如何从RSS iTunes中读取图像标签

FEED:

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

<channel> 
<title>title of the podcast</title> 
<itunes:image href="http://www.MyWeb/myImg.png"/> 
</channel> 
</rss> 

PHP:

$xml=("http://www.myWeb/rss.xml"); 
$xmlDoc = new DOMDocument(); 
$xmlDoc->load($xml); 

$channel=$xmlDoc->getElementsByTagName('channel')->item(0); 

$channel_title = $channel->getElementsByTagName('title')//normal tag 
->item(0)->childNodes->item(0)->nodeValue; 

$channel_image = $channel->getElementsByTagName('image') //problem 
->item(0)->childNodes->item(0)->nodeValue; 

echo $channel_title . '<br>'; 
echo $channel_image . '<br>'; 

回答

2

你可以使用的SimpleXML。由于image元素有一个命名空间前缀(itunes),您必须使用儿童方法传递的命名空间URL,然后调用attributes方法:

$feed = simplexml_load_file('http://www.myWeb/rss.xml'); 
foreach ($feed->channel as $channel) { 
    $ns_itunes = $channel->children('http://www.itunes.com/dtds/podcast-1.0.dtd'); 
    echo $ns_itunes->image->attributes(); 
} 
+0

$ ns_itunes准确地做了什么?我把这个地址粘贴到了Safary,我看不到任何东西 – Nrc 2014-08-29 10:27:12

+0

我试过了上面的代码片段(当然是用.xml的正确路径),它工作得很好。通过'$ ns_itunes',您可以轻松地在每个标签前面调用'itunes:',因为您已经声明了要使用的名称空间。 – JoelP 2014-08-29 10:30:04

+0

是的,代码工作,但我不明白$ ns_itunes做什么或iTunes地址是什么。 – Nrc 2014-08-29 10:34:58

1

属性xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"定义的别名/前缀的iTunes为一命名空间。

的DOM解决了命名空间前缀,所以你可以理解为图像节点名称:

{http://www.itunes.com/dtds/podcast-1.0.dtd}:image 

您目前正在使用标准DOM函数来获取节点。这里是它们的命名空间感知版本(后缀NS)。但更好的解决方案是Xpath。这是DOM扩展的一部分,并允许您使用表达式从DOM中获取数据。

为您的DOM的DOMXPath实例,并取标题为字符串:

$xpath = new DOMXpath($xmlDoc); 

echo $xpath->evaluate('string(/rss/channel/title)'), "\n"; 

要在您需要注册自己的前缀为它命名空间地址的节点。

$xpath = new DOMXpath($xmlDoc); 
$xpath->registerNamespace('it', 'http://www.itunes.com/dtds/podcast-1.0.dtd'); 

echo $xpath->evaluate('string(/rss/channel/it:image/@href)'); 

这里可以是几个项目,以便获取和重复它们,使用返回的节点作为上下文参数的评估来获得详细信息。

foreach ($xpath->evaluate('/rss/channel/item') as $item) { 
    echo $xpath->evaluate('string(enclosure/@url)', $item); 
} 
+0

它运作得很好。我只有内部项目中的标记url存在问题:我试过:$ xpath- >评估( '字符串(/ RSS /信道/项目/ enclousure/@ URL)'); – Nrc 2014-08-30 09:04:55

+0

表达式中的“enclosure”一词中有一个拼写错误。我为这些项目添加了一个示例。 – ThW 2014-08-30 09:32:21

+0

我试图搜索以了解有关此方法的更多信息,并且我发现评估与IExplorer不兼容,我理解的很好吗?这是一个学习更多的好地方吗? http://www.w3schools.com/xpath/xpath_examples.asp – Nrc 2014-08-30 09:57:21