从 SimpleXMLElement 对象获取媒体 url 属性

Getting media url attribute from SimpleXMLElement object

我想使用 simplexml 从 RSS 的 'media:content' 标签中获取 'url' 属性。 我在网上搜索了几个小时,但无法正常工作。 这是代码:

<?php
$rss ='<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/">
    <channel>
        <item>
            <media:content url="http://blog.com/image1.jpg" width="661" height="310"/>
        </item>
    </channel>
</rss>';

$xml = simplexml_load_string($rss);
$url = $xml->children('media', true)->content;

var_dump($xml);
var_dump($url); // <- This is object(SimpleXMLElement)[3]
var_dump($url['url']); // <- This is NULL

$url 为 NULL。 ->content returns 一个 SimpleXMLElement 但它没有任何 url 属性!

问题是您忽略了 media 命名空间。

this link 中,您可以找到更多有关如何使用指定命名空间处理标签的信息。

在示例中,命名空间被传递给 children 成员函数以限定 media:content 标记的范围。

$xml = simplexml_load_string($rss);
$url = $xml->children('http://search.yahoo.com/mrss/')->content;

var_dump($xml);
var_dump($url); // <- This is object(SimpleXMLElement)[3]
var_dump($url['url']); // <- This is NULL

您可以将 SimpleXMLElement xpath 与此表达式一起使用来获取 media:content 元素:

/rss/channel/item/media:content

$xml = simplexml_load_string($rss);
$urls = $xml->xpath('/rss/channel/item/media:content');

// Get url from the first match
echo $urls[0]->attributes()->url;

// Loop all the matches
foreach ($urls as $url) {
    echo $url->attributes()->url;
}

Php demo output

或者您可以遍历此项目的子项:

foreach ($xml->channel->item->children("media", true) as $child) {
    echo $child->attributes()->url;
}

Php demo output

首先你必须确保你获取了正确的 content 元素,所以确保你获取了内容节点的完整路径(注意设置 $url 中的额外路径多变的)。然后有一些奇怪的获取命名空间元素的属性(我相信他们自己没有命名空间),要访问它们你必须使用 attributes() 方法然后使用 ['url'] 获取元素.您可以尝试添加的选项...

$xml = simplexml_load_string($rss);
$url = $xml->channel->item->children('media', true)->content;

var_dump($xml);
var_dump($url); // <- This is object(SimpleXMLElement)[3]
var_dump($url['url']); // <- This is NULL
var_dump($url->attributes()['url']);
echo "url-".(string)$url->attributes()['url'].PHP_EOL;

最后两行给你...

class SimpleXMLElement#6 (1) {
  public [=11=] =>
  string(26) "http://blog.com/image1.jpg"
}
url-http://blog.com/image1.jpg

(echo 无论如何都会将值转换为字符串,但我把它放在以防万一您尝试分配值并想要值而不是 SimpleXMLElement 对象)