我试图从RSS链接中提取图片网址。
这是其中一个项目的图像。
在图片中有一个标记media:thumbnail
我正在使用它来获取标题,链接和描述:
$item_title = $item->getElementsByTagName('title')->item(0)->childNodes->item(0)->nodeValue;
$item_link = $item->getElementsByTagName('link')->item(0)->childNodes->item(0)->nodeValue;
$item_desc = $item->getElementsByTagName('description')->item(0)->childNodes->item(0)->nodeValue;
但我似乎无法取出media:thumbnail
。
我和其他人的尝试一样
$item_img = $item->getElementsByTagName('media:thumbnail')->item(0)->childNodes->item(0)->nodeValue;
第24行是我试过的行。但我也试过使用.attribute(url)
,但这也没有回归。
我希望有人可以帮我解决这个问题,自从我遇到这个问题以来已经过了4个小时但是经过大量的尝试和错误后,我没有一次得到这个URL。
提前致谢,并且编码很快。
答案 0 :(得分:1)
The media:
part on elements in your XML, is called a namespace prefix,在客户端浏览器请求中添加授权标头,并表示名称空间URI。您应该能够在xmlns:media
元素的祖先之一上找到此URI作为media:
属性的值。如果找不到,则应该能够在元素本身上使用xmlns
属性的URI值(如果适用,在这种情况下, )。
为了从某个命名空间中获取某些元素,您应该使用该命名空间的URI并调用DOMDocument::getElementsByTagNameNS()
而不是DOMDocument::getElementsByTagName()
,如下所示:
$item_img = $item->getElementsByTagNameNS('the namespace URI you found','thumbnail')
->item(0)
->childNodes
->item(0)->nodeValue;
如果您不关心定义特定元素的命名空间,您可以继续使用DOMDocument::getElementsByTagName()
,但不要使用命名空间前缀:
$item_img = $item->getElementsByTagName('thumbnail')
->item(0)
->childNodes
->item(0)->nodeValue;
请注意,无论它们处于什么命名空间,这都将获取所有 <thumbnail>
个元素。
但是,在示例XML中,您显示了 1 ,<media:thumbnail>
元素没有任何子节点,因此上面调整的代码示例仍然会失败。
最后,.attribute(url)
只是无效的语法。当然应该是->getAttribute('url')
。
因此,要将其包装起来,您应该能够获得特定命名空间的第一个url
的{{1}}属性:
<thumbnail>
或:
$item_img = $item->getElementsByTagNameNS('the namespace URI you found','thumbnail')
->item(0)->getAttribute('url');
如果你不关心元素的命名空间。
1)请在下次发布实际的示例XML代码,而不是图像。