从SimpleXMLElement对象获取media url属性

时间:2018-02-16 02:40:58

标签: php rss simplexml xml-namespaces

我想得到' url'属性来自媒体:内容'使用simplexml的RSS标记。 我在网上搜了好几个小时但却无法上班。 这是代码:

<?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。 - &gt;内容返回SimpleXMLElement但它没有任何url属性!

3 个答案:

答案 0 :(得分:2)

首先,您必须确保获取正确的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 ${0} =>
  string(26) "http://blog.com/image1.jpg"
}
url-http://blog.com/image1.jpg

(无论如何,echo会将值转换为字符串,但我把它放在以防你尝试赋值并想要值而不是SimpleXMLElement对象的情况下)

答案 1 :(得分:1)

您可以使用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

答案 2 :(得分:0)

问题在于您忽略了 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