【问题标题】:Getting media url attribute from SimpleXMLElement object从 SimpleXMLElement 对象获取媒体 url 属性
【发布时间】:2018-02-16 02:40:58
【问题描述】:

我想使用 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 返回一个 SimpleXMLElement 但它没有任何 url 属性!

【问题讨论】:

    标签: php rss simplexml xml-namespaces


    【解决方案1】:

    首先,您必须确保获取正确的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 对象)

    【讨论】:

    • 谢谢。这也是一个解决方案。
    • 是的,unprefixed attributes are always in no namespace at all。作为一种风格,你也可以写$url-&gt;attributes()-&gt;url,如果你想明确“我在这里选择空命名空间”,你可以使用-&gt;attributes(null)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 2015-01-04
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      相关资源
      最近更新 更多