Php 从SimpleXMLElement对象获取媒体url属性
我想使用simplexml从RSS的“media:content”标记中获取“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>
<?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)
。