递归Expat XML到PHP数组

时间:2014-09-08 07:20:21

标签: php arrays xml recursion xml-parsing

我写了一个递归函数,它应该将xml转换为关联数组。 到目前为止我写的函数只使用了包含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
                                                )

                                        )

                                )

                        )

                )

        )

)

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

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

1 个答案:

答案 0 :(得分:1)

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

$append[$tag] = _xml2array ...

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

因此,您需要对大小写进行编码,可以有零个或多个标记名:

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

由于你在complete状态也犯了同样的错误,你也需要在那里修改你的代码,我作为一个微不足道的练习留下来在那里应用给定的答案。