Я хочу написать функцию, которая анализирует (теоретически) неизвестную структуру данных XML в эквивалентный массив PHP.
Вот мой пример XML:
<?xml version="1.0" encoding="UTF-8"?>
<content>
<title>Sample Text</title>
<introduction>
<paragraph>This is some rudimentary text</paragraph>
</introduction>
<description>
<paragraph>Here is some more text</paragraph>
<paragraph>Even MORE text</paragraph>
<sub_section>
<sub_para>This is a smaller, sub paragraph</sub_para>
<sub_para>This is another smaller, sub paragraph</sub_para>
</sub_section>
</description>
</content>
Я изменил эту итеративную функцию DOM из devarticles:
$data = 'path/to/xmldoc.xml';
$xmlDoc = new DOMDocument(); #create a DOM element
$xmlDoc->load( $data ); #load data into the element
$xmlRoot = $xmlDoc->firstChild; #establish root
function xml2array($node)
{
if ($node->hasChildNodes())
{
$subNodes = $node->childNodes;
foreach ($subNodes as $subNode)
{
#filter node types
if (($subNode->nodeType != 3) || (($subNode->nodeType == 3)))
{
$arraydata[$subNode->nodeName]=$subNode->nodeValue;
}
xml2array($subNode);
}
}
return $arraydata;
}
//The getNodesInfo function call
$xmlarray = xml2array($xmlRoot);
// print the output - with a little bit of formatting for ease of use...
foreach($xmlarray as $xkey)
{
echo"$xkey<br/><br/>";
}
Теперь, из-за того, как я передаю элементы в массив, я перезаписываю любые элементы, которые имеют общее имя узла (поскольку в идеале я хочу дать ключам то же имя, что и их исходным узлам). Моя рекурсия не велика ... Однако, даже если я опущу квадратные скобки - второй уровень узлов все еще входит как значения на первом уровне (см. Текст описания узла).
У кого-нибудь есть идеи, как мне лучше построить это?