【问题标题】:Recursive Expat XML to PHP Array递归 Expat XML 到 PHP 数组
【发布时间】:2014-09-08 07:20:20
【问题描述】:

我编写了一个递归函数,它应该将 xml 转换为关联数组。 到目前为止,我编写的函数适用于仅包含 1 个子元素的根元素,但是当我在根元素超过 1 个子元素的 xml 上尝试它时,它只输出第一个子元素。

这是我写的函数: $values 是来自 xml_parse_into_struct 的值数组。

    function _xml2array($append, $values, $i) {
    if($i == count($values) - 1) {
        return $append;
    }

    switch($values[$i]['type']) {
        case 'open':
            $tag = $values[$i]['tag'];
            $append[$tag][] = _xml2array($append[$tag], $values, ++$i);
            return $append;
        case 'complete':
            $tag = $values[$i]['tag'];
            $val = $values[$i]['value'];
            $append[$tag] = $val;
            return _xml2array($append, $values, ++$i);
        case 'close':
            return $append;
    }
}

function xml2array($values) {
    return _xml2array(array(), $values, 0);
}

这是我正在处理的 xml:

<?xml version="1.0"?>

<espadas>
    <espada>
        <name>Coyote Starrk</name>
        <rank>Primera</rank>
        <resurreccion>
            <release-command>Kick About</release-command>
            <zan-name>Los Lobos</zan-name>
        </resurreccion>
    </espada>
    <espada>
        <name>Baraggan Louisenbairn</name>
        <rank>Segunda</rank>
        <resurreccion>
            <release-command>Rot</release-command>
            <zan-name>Arrogante</zan-name>
        </resurreccion>
    </espada>
</espadas>

这是我得到的输出:

Array
(
    [ESPADAS] => Array
        (
            [0] => Array
                (
                    [ESPADA] => Array
                        (
                            [0] => Array
                                (
                                    [NAME] => Coyote Starrk
                                    [RANK] => Primera
                                    [RESURRECCION] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [RELEASE-COMMAND] => Kick About
                                                    [ZAN-NAME] => Los Lobos
                                                )

                                        )

                                )

                        )

                )

        )

)

我只生第一个孩子,我做错了什么? 任何形式的帮助将不胜感激。

编辑: 再次尝试调试,并意识到我需要放置一个基本案例。 但这仍然给我留下了一个只有第一个孩子的数组。

【问题讨论】:

  • 我没有考虑到这一点,我可以删除根元素 ESPADAS 并将根键设置为 ESPADA 并将每个 ESPADA 存储在其当前位置

标签: php arrays xml recursion xml-parsing


【解决方案1】:

您的代码期望编码有一个具有相同标记名的子元素。

$append[$tag] = _xml2array ...

这是一个错误的期望。 XML 可以有 0-n 个具有相同标记名的子元素。

因此您需要对可能有零个或多个标记名的情况进行编码:

$append[$tag][] = _xml2array ...

由于您在 complete 状态上也犯了同样的错误,因此您还需要在那里修改您的代码,我将其作为一个简单的练习来应用给定的答案。

【讨论】:

  • 完整的只会出现一次,我可以保持原样吗?我添加了你写的更改 ...[$tag][] = ... 它仍然只显示第一个元素。
  • 我会平等对待所有情况,以保持较低的复杂性。否则,您每次都需要考虑您遇到的情况并使用不同的逻辑来处理它。接下来,如果我可能会问,xml_parse_into_struct 已经返回的数组有什么问题?
  • 现在当你评论它时,当你将$append[$tag] 传递给_xml2array 时,你可能也有一个缺陷。到目前为止,我没有强调那部分。
  • 我想以简洁的方式显示数组,只有标签和值,没有其他数据,如级别和类型。
  • 你想在哪里展示它?如果只是显示,则无需更改结构,只需更改打印/显示的方式即可。
猜你喜欢
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 2021-04-23
  • 2013-08-28
  • 1970-01-01
  • 2012-04-19
相关资源
最近更新 更多