【问题标题】:How to read image tag from RSS itunes如何从 RSS iTunes 中读取图像标签
【发布时间】:2014-10-23 07:42:21
【问题描述】:

我尝试阅读我的 iTunes RSS。我可以阅读标题,甚至 itunes:subtitle,但标签图像有问题。

饲料:

<?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>';

【问题讨论】:

    标签: php xml rss


    【解决方案1】:

    您可以使用 SimpleXML。因为image元素有命名空间前缀(itunes),所以必须使用children方法传递命名空间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();
    }
    

    【讨论】:

    • $ns_itunes 到底是做什么的?我已将地址粘贴到 Safari 中,但看不到任何内容
    • 我尝试了上面的 sn-p (当然有正确的 .xml 路径),它工作得很好。使用$ns_itunes,您现在可以轻松调用前面带有itunes: 的每个标签,因为您声明了要使用的命名空间。
    • 是的,代码有效,但我不明白 $ns_itunes 的作用或 iTunes 地址中的内容。
    • children 函数获取所有元素 children: php.net/manual/de/simplexmlelement.children.php 。作为参数给出的地址只是说明了命名空间。你也可以删除它,如果这让你很恼火。
    • 您不能简单地删除命名空间声明。您可以将 xml 命名空间想象成电话号码中的区号。有关更多信息,请查看一些谷歌搜索结果到xml namespace
    【解决方案2】:

    xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" 属性为 a 命名空间定义了一个别名/前缀 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);
    }
    

    【讨论】:

    • 它也很好用。我只对 item 内的标签 url 有问题:myWeb/mySound.mp3" length="624557" type="audio/mp3"/> 我试过: $xpath->evaluate('string(/rss /channel/item/enclousure/@url)');
    • 您在表达式中的 enclosure 一词中有错字。我为这些项目添加了一个示例。
    • 我试图搜索以了解有关此方法的更多信息,但我发现评估不适用于 IExplorer,我理解了吗?这是了解更多信息的好地方吗? w3schools.com/xpath/xpath_examples.asp
    • 是和不是。 IE 没有实现 DOM3 Xpath 规范,但可以通过 JS 库添加。
    猜你喜欢
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多