无法迭代SimpleXMLElement对象并插入到数组中

时间:2016-01-30 01:54:40

标签: php xml xml-parsing simplexml

我有以下XML:

<channels>
  <channel>
    <name>Channel 1</name>
    <tid>15179</tid>
  </channel>
  <channel>
    <name>Channel 2</name>
    <tid>15177</tid>
  </channel>
  <channel>
    <name>Channel 3</name>
    <tid>15176</tid>
  </channel>
  <channel>
    <name>Channel 4</name>
    <tid>15407</tid>
  </channel>
  <channel>
    <name>Channel 5</name>
    <tid>15175</tid>
  </channel>
  <channel>
    <name>Channel 6</name>
    <tid>15178</tid>
  </channel>
</channels>

并使用SimpleXMLElement,我得到了这个对象:

SimpleXMLElement Object
(
    [channel] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [name] => Channel 1
                    [tid] => 15179
                )

            [1] => SimpleXMLElement Object
                (
                    [name] => Channel 2
                    [tid] => 15177
                )

            [2] => SimpleXMLElement Object
                (
                    [name] => Channel 3
                    [tid] => 15176
                )

            [3] => SimpleXMLElement Object
                (
                    [name] => Channel 4
                    [tid] => 15407
                )

            [4] => SimpleXMLElement Object
                (
                    [name] => Channel 5
                    [tid] => 15175
                )

            [5] => SimpleXMLElement Object
                (
                    [name] => Channel 6
                    [tid] => 15178
                )

        )

)

我试图简单地迭代这个对象以将通道放入一个数组中,但无论我如何尝试迭代,我得到的只是SimpleXMLElement对象,显然它不允许将它们用作数组键。例如,这个代码

$channel_data = new SimpleXMLElement($channel_xml->data);
foreach ($channel_data->children() as $nb_channel) {
  $channel_name = $nb_channel->name;
  $channel_tid = $nb_channel->tid;
  $target_channels[$channel_tid[0]] = $channel_name[0];
}

$ channel_name和$ channel_tid也作为SimpleXMLElements出现。如果我试试

foreach ($channel_data->channel as $nb_channel) {
  $channel_name = $nb_channel->name;
  $channel_tid = $nb_channel->tid;
  $target_channels[$channel_tid] = $channel_name;
}

$ channel-&gt; name和$ channel-&gt; tid也是simpleXMLElement对象。

SimpleXMLElement Object
(
    [name] => Channel 1
    [tid] => 15179
)

但是试图以

的形式访问它们
   $nb_channel->name;

给我另一个对象:

SimpleXMLElement Object
(
    [0] => Channel 1
)

迭代XML以获取数据并将其放入数组的正确方法是什么?

感谢。

1 个答案:

答案 0 :(得分:1)

和往常一样,“发布一个问题,然后找出答案”的原则是有效的。

诀窍是使用__toString()将值转换为字符串:

$channel_data = new SimpleXMLElement($channel_xml->data);
foreach ($channel_data->channel as $nb_channel) {
  $channel_name = $nb_channel->name->__toString();
  $channel_tid = $nb_channel->tid->__toString();
  $target_channels[$channel_tid] = $channel_name;
}

一旦我这样做,我的变量就有了正确的数据,并且我能够填充$ target_channels数组。