Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从SimpleXMLElement对象获取媒体url属性_Php_Rss_Simplexml_Xml Namespaces - Fatal编程技术网

Php 从SimpleXMLElement对象获取媒体url属性

Php 从SimpleXMLElement对象获取媒体url属性,php,rss,simplexml,xml-namespaces,Php,Rss,Simplexml,Xml Namespaces,我想使用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>

我想使用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

问题在于您忽略了媒体名称空间

在中,您可以找到有关如何使用指定的命名空间寻址标记的更多信息

在本例中,命名空间被传递给
children
成员函数,以限定
媒体:内容
标记的范围

$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
$xml=simplexml\u load\u字符串($rss);
$url=$xml->children('http://search.yahoo.com/mrss/)->内容;
var_dump($xml);

var_dump($url);// 问题是您忽略了媒体名称空间

在中,您可以找到有关如何使用指定的命名空间寻址标记的更多信息

在本例中,命名空间被传递给
children
成员函数,以限定
媒体:内容
标记的范围

$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
$xml=simplexml\u load\u字符串($rss);
$url=$xml->children('http://search.yahoo.com/mrss/)->内容;
var_dump($xml);
var_dump($url);// 例如,您可以使用此表达式来获取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;
}

或者,您可以循环浏览此项的子项:

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

例如,您可以使用此表达式获取媒体:内容元素:

/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;
}

或者,您可以循环浏览此项的子项:

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

首先,您必须确保获取正确的
内容
元素,因此确保获取内容节点的完整路径(请注意设置
$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;

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

首先,您必须确保获取正确的
内容
元素,因此请确保获取内容节点的完整路径(请注意设置
$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;

(echo无论如何都会将值强制转换为字符串,但我把它放在了这样一个位置,以防您尝试分配该值并希望使用该值而不是SimpleXMLElement对象)

children('media',TRUE)与您编写的内容相同。请参阅此链接:children('media',TRUE)与您编写的内容相同。请参阅此链接:谢谢。这也是一个解决方案。是的。作为一种风格,您还可以编写
$url->attributes()->url
,如果您想明确说明“我在这里选择空名称空间”,您可以使用
->attributes(null)
。谢谢。这也是一个解决方案。是的。作为一种风格,您还可以编写
$url->attributes()->url
,如果您想明确说明“我在这里选择空名称空间”,您可以使用
->attributes(null)