我正在尝试阅读此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;
}
答案 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);