访问对象属性(向下钻取而不进行数组转换)

时间:2013-12-24 12:04:03

标签: php xml arrays oop object

我最近一直在使用tv_grab_uk_rt生成电视指南xml文件。我编写了一个脚本来将XML转换为一个对象,我可以循环并插入到数据库中。虽然我有脚本工作,但我遇到了一个我想要澄清的问题。

将XML放入对象时,我得到以下内容:

SimpleXMLElement Object
(
[@attributes] => Array
    (
        [date] => Mon, 23 Dec 2013 04:30:01 GMT
        [source-info-url] => http://www.radiotimes.com
        [source-info-name] => Radio Times XMLTV Service
        [source-data-url] => http://xmltv.radiotimes.com/xmltv/channels.dat
        [generator-info-name] => XMLTV/0.5.61, tv_grab_uk_rt 1.342, 2011/06/19 06:50:36 
        [generator-info-url] => http://www.xmltv.org
    )

[channel] => Array
    (
        [0] => SimpleXMLElement Object
            (
                [@attributes] => Array
                    (
                        [id] => fiver.channel5.co.uk
                    )

                [display-name] => 5*
                [icon] => SimpleXMLElement Object
                    (
                        [@attributes] => Array
                            (
                                [src] => http://www.lyngsat-logo.com/logo/tv/cc/channel5_star.jpg
                            )

                    )

            )
    )
)

让我们说这个对象包含在变量$xml中,如果我要执行以下操作:

foreach($xml->channel as $channel)
{
  echo $channel->displayname
}

我意识到我能够回显displayname的对象属性,在本例中为5*

但是,如果我想在这种情况下回复src http://www.lyngsat-logo.com/logo/tv/cc/channel5_star.jpg会发生什么,我将如何使用对象进行此操作。我不能这样做

foreach($xml->channel as $channel)
{
  echo $channel->icon->@attributes->src
}

以数组为例,您可以轻松完成

foreach($xml['channel'] as $channel)
{
  echo $channel['icon']['@attributes']['src'];
}

但不是对象。我没有进入无限循环,而是发现我可以将对象转换为类似的数组

 foreach($xml->channel as $channel)
{
  echo $channel['icon']['@attributes']['src'];
  $channelArray = get_object_vars($channel);
}

然后我可以简单地将属性作为数组访问。 所以我的问题是,如果不将对象转换为数组,是否有办法深入研究属性,即

$xml->channel->0->displayname

1 个答案:

答案 0 :(得分:1)

每个channel都是SimpleXMLElement个实例,因此您可以

foreach($xml->channel as $channel)
{
  echo $channel->icon->attributes()->src;
}

如有疑问,请始终从官方文档开始。