You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 11:42:34