PHP解析RSS格式XML时无法提取<enc:enclosure>节点的rdf:resource属性值
PHP解析RSS格式XML时无法提取enc:enclosure节点的rdf:resource属性值
嘿,我看你卡在提取<enc:enclosure>节点里的rdf:resource属性值这儿了,其实问题的核心是你搞混了命名空间属性和子节点的获取方式,咱们来一步步搞定它~
首先,你之前用children()方法去获取rdf相关的内容,但rdf:resource是节点的属性,不是子元素,所以children()根本找不到它!正确的做法是用attributes()方法,指定对应的命名空间来获取这个属性。
咱们先修改你原有的代码片段,把错误的部分替换掉:
foreach ($xml->item as $item) { // 获取enc命名空间下的子元素 $encNodes = $item->children('http://purl.oclc.org/net/rss_2.0/enc/'); if ($encNodes) { foreach ($encNodes as $enclosure) { echo '<pre>';print_r($enclosure);echo'</pre>'; echo 'Length: ' . $enclosure['length'] . '<br />'; // 关键:用attributes()获取rdf命名空间下的resource属性 $rdfAttrs = $enclosure->attributes('http://www.w3.org/1999/02/22-rdf-syntax-ns#'); echo 'Resource: ' . $rdfAttrs['resource'] . '<br />'; // 现在就能正常输出图片链接啦! } } }
如果你觉得这种写法有点繁琐,用XPath来处理命名空间会更直观,提前注册好命名空间后直接查询就行,代码会更简洁:
$xml = simplexml_load_string($xml_string); // 注册命名空间,方便后续XPath查询 $xml->registerXPathNamespace('enc', 'http://purl.oclc.org/net/rss_2.0/enc/'); $xml->registerXPathNamespace('rdf', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'); // 用XPath直接找到所有enc:enclosure节点 $enclosures = $xml->xpath('//enc:enclosure'); foreach ($enclosures as $enclosure) { echo 'Length: ' . $enclosure['length'] . '<br />'; // 直接通过命名空间前缀获取属性 echo 'Resource: ' . $enclosure->attributes('rdf')['resource'] . '<br />'; }
这里要注意两个关键点:
- 命名空间的属性不能用
children()获取,必须用attributes()方法并指定对应的命名空间URI(或者注册后的前缀) - 如果用XPath,一定要先注册对应的命名空间,否则查询会找不到节点
这样调整之后,你就能顺利提取到图片链接啦~
备注:内容来源于stack exchange,提问作者SamuElias
相关产品推荐
相关产品推荐

