从XML文件构建数组作为树结构

时间:2016-08-03 09:36:59

标签: php xml

我正在尝试阅读此xml文件,但我尝试制作的代码应该适用于任何xml文件:

<?xml version="1.0"?>
<auto>
    <binnenkant>
        <voorkant>
            <stuur/>
            <gas/>
        </voorkant>
        <achterkant>
            <stoel/>
            <bagage/>
        </achterkant>
    </binnenkant>
    <buitenkant>
        <dak>
            <dakkoffer>
                <sky/>
                <schoen/>
            </dakkoffer>    
        </dak>
        <trekhaak/>
        <wiel/>
    </buitenkant>
</auto>

我使用下面的两个函数将XML文件转换为数组并将该数组转换为树 我试图保持XML文件的父子关系。我从第二个函数返回的所有内容都是一个包含xml文件中所有标记的数组。

有人可以帮帮我吗?

function build_xml_tree(array $vals, $parent, $level) {
    $branch = array();

    foreach ($vals as $item) {
        if (($item['type'] == "open") || $item['type'] == "complete") {
            if ($branch && level == $item['level']) {
                array_push($branch, ucfirst(strtolower($item['tag'])));
            } else if ($parent == "" || $level < $item['level']) {
                $branch = array(ucfirst(strtolower($item['tag'])) => build_xml_tree($vals, strtolower($item['tag']), $level));
            }
        }
    }
    return $branch;
}

function build_tree ($begin_tree, $content_naam) {
    $xml = file_get_contents('xml_files/' . $content_naam . '.xml');
    $p = xml_parser_create();
    xml_parse_into_struct($p, $xml, $vals, $index);

    ?>
    <pre>
    <?php
    print_r($vals);
    ?>
    </pre>
    <?php

    $eindarray = array_merge($begin_tree, build_xml_tree($vals, "", 1));

    return $eindarray;
}

1 个答案:

答案 0 :(得分:0)

有许多类可以加载XML文件。其中许多已经在树结构中表示文件:DOMDocument是其中之一。

当你在DOMDocument对象中有一棵树时,想要将树作为一个数组似乎有点奇怪:因为你必须以某种方式遍历数组树...为什么不直接遍历对象树的树结构进行打印?例如?

无论如何,以下代码应该满足您的要求:我使用了一个递归函数,其中数组树通过引用传递。 在这一点上安排我的代码以更好地满足您的需求应该是微不足道的 - 即用更多switch块完成case语句。

  • $tree数组具有每个节点级别的数字键
  • 标记节点名称是字符串值
  • 如果数组跟随字符串值,则它包含节点的子项
  • 任何潜在的文本节点都被威胁为子节点
function buildTree(DOMNode $node = NULL, &$tree) {

    foreach ($node->childNodes as $cnode) {

        switch($cnode->nodeType) {
            case XML_ELEMENT_NODE:
                $tree[] = $cnode->nodeName;
                break;
            case XML_TEXT_NODE:
                $tree[] = $cnode->nodeValue;
                break;
        }

        if ($cnode->hasChildNodes())
            buildTree($cnode, $tree[count($tree)]);
    }
}

$source ='the string which contains the XML';

$doc = new DOMDocument();
$doc->preserveWhiteSpace = FALSE;
$doc->loadXML($source, LIBXML_NOWARNING);

$tree = array();
buildTree($doc, $tree);

var_dump($tree);