Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从RSS itunes读取图像标签_Php_Xml_Rss - Fatal编程技术网

Php 如何从RSS itunes读取图像标签

Php 如何从RSS itunes读取图像标签,php,xml,rss,Php,Xml,Rss,我试着阅读我的iTunes RSS。我可以阅读标题,甚至itunes:subtitle,但我对标签图像有问题 提要: 播客标题 PHP: $xml=(“http://www.myWeb/rss.xml"); $xmlDoc=新的DOMDocument(); $xmlDoc->load($xml); $channel=$xmlDoc->getElementsByTagName('channel')->项(0); $channel\u title=$channel->getElementsByT

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

提要:


播客标题
PHP:

$xml=(“http://www.myWeb/rss.xml");
$xmlDoc=新的DOMDocument();
$xmlDoc->load($xml);
$channel=$xmlDoc->getElementsByTagName('channel')->项(0);
$channel\u title=$channel->getElementsByTagName('title')//普通标记
->项(0)->子节点->项(0)->节点值;
$channel\u image=$channel->getElementsByTagName('image')//问题
->项(0)->子节点->项(0)->节点值;
echo$channel_title。”
'; 回显$channel_图像。”
';
您可以使用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();
}

属性
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)');
这里可以有几个项目,因此获取并迭代它们,使用返回的节点作为evaluate中的上下文参数以获取详细信息

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

$ns_itunes到底是做什么的?我已经在Safary中粘贴了地址,但我看不到任何东西。我尝试了上面的代码片段(当然有一个到.xml的正确路径),效果很好。使用
$ns_itunes
您现在可以轻松调用前面的每个标记,因为您声明了要使用的名称空间。是的,代码可以工作,但我不了解$ns_itunes做什么或itunes地址中有什么。children函数获取所有元素children:。作为参数提供的地址仅表示名称空间。你也可以删除它,如果这让你恼火的话。你不能简单地删除名称空间声明。您可以将xml名称空间想象成电话号码中的区号。有关更多信息,请查看一些google搜索结果,以
xml名称空间
。它也很有效。我只对项中的标记url有问题:我尝试了:$xpath->evaluate('string(/rss/channel/item/enclosure/@url)');表达式中的
附件
一词输入错误。我为这些项目添加了一个示例。我尝试搜索以了解有关此方法的更多信息,发现evaluate不适用于IExplorer,我是否理解得很好?这是学习更多知识的好地方吗?是和否。IE没有DOM3 Xpath规范的实现,但可以添加JS库。
$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);
}