1

我有一个生成 xml 的 rss feed url,如下所示:

 <?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/" 
 xmlns:flow="http://www.flownetworks.com/schemas/media/0.1.0"><channel>
 <title>flow-Media Catalog</title>
 <link>http://catalog.flownetworks.com/catalogs/1/videos.mrss</link>
 <description>Video Catalog</description>
 <image>
    <url>http://images.flow-media.com/flow_media_current.png</url>
    <title>Get to know flow-Media</title>
    <link>http://www.flow-media.com</link>
 </image>
 <generator>flow-Media</generator>
 <item>
   <title>..</title>
   <link>..</link>
   <description>..</description>
   <pubDate>Wed, 01 May 2013 07:01:08 GMT</pubDate>
   <guid isPermaLink="false">9809880</guid>
   <flow:short_description/>
   <flow:video_product_id>52985890</flow:video_product_id>
   <flow:availability end="" start="2013-05-01T06:44:41Z"/>
   <flow:show/>
   <media:group>
   <media:category>US</media:category>
   <media:thumbnail url="http://images.flow-media.com/ap/2013/05/01/09d462107646ab09def454a1a923a423edd6d2d9_preview.jpg" height="360" width="640"/>
   <media:thumbnail url="http://images.flow-media.com/ap/2013/05/01/09d462107646ab09def454a1a923a423edd6d2d9_thumbnail.jpg" height="90" width="160"/>
   <media:content duration="101" medium="video" isDefault="true" url="http://player.flownetworks.com/swf/cube.swf?a=V5299690&amp;m=9&amp;w=420&amp;h=375" type="application/x-shockwave-flash" expression="full" height="375" lang="en-us" width="420">
    </media:content>
    </media:group>
   </item>
   </channel>

我想将图像和类别值保存在数据库中。这是我的 php 代码:

$apiURL="http://catalog.flownetworks.com/catalogs/01/videos/search.mrss?api_key=%206784cb3bed8f80c55054ac0de996f8e9f0bf8763";
$videoId="&video_product_id=".$videoID."";
$combinevURL=$apiURL.$videoId;
$mediafile = simplexml_load_file($combinevURL); 

问题:问题是“simplexml_load_file”不生成xml的类别名称和媒体缩略图图像值。我想从这个xml中获取值。请帮助。

4

1 回答 1

4

要成功获取这些媒体元素,首先需要找到父元素。如何访问那些非命名空间元素在基本的 Simplexml 使用示例中进行了深入概述,我在这里省去了这些高度冗余的代码。

因此,在将父级获取到变量中之后——$item这次我们称之为——它的工作原理与已经暗示的重复问答材料中的概述一样,只是此处特定于您的示例 XML:

$media = $item->children('media', true);
                            |
                          __|__
 <rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/" 
                    xmlns:flow="http://www.flownetworks.com/schemas/media/0.1.0">

通过使用命名空间前缀,它对应于突出显示的前缀部分。这需要true用作第二个参数。

您也可以使用替代方案,命名空间 URI,这样您就可以省去第二个参数(默认为FALSE):

$media = $item->children('http://search.yahoo.com/mrss/');
                                        |
                                 _______|_____________________
 <rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/" 
                    xmlns:flow="http://www.flownetworks.com/schemas/media/0.1.0">

无论您喜欢哪种变体,准确地告诉 simplexml 您关心媒体XML 命名空间中的项,使您能够从该媒体组中访问您所知道的各个部分:

$group = $media->group;
echo $group->category, "\n"; # US

我希望这会有所帮助,并明确地向您展示它是如何用于命名空间元素的。您需要使用该SimpleXMLElement::children()方法并指定要从哪个命名空间获取子元素。

于 2013-05-01T17:51:30.507 回答