从 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;
}
或者您可以遍历此项目的子项:
foreach ($xml->channel->item->children("media", true) as $child) {
echo $child->attributes()->url;
}
首先你必须确保你获取了正确的 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 对象)
我想使用 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;
}
或者您可以遍历此项目的子项:
foreach ($xml->channel->item->children("media", true) as $child) {
echo $child->attributes()->url;
}
首先你必须确保你获取了正确的 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 对象)