protected static function &convert($node)
{
$output = array();
switch ($node->nodeType) {
case XML_CDATA_SECTION_NODE:
$output[static::$prefix_attributes . 'cdata'] = trim($node->textContent);
break;
case XML_TEXT_NODE:
$output = trim($node->textContent);
break;
case XML_ELEMENT_NODE:
// for each child node, call the covert function recursively
for ($i = 0, $m = $node->childNodes->length; $i < $m; $i++) {
$child = $node->childNodes->item($i);
$v = self::convert($child);
if (isset($child->tagName)) {
$t = $child->tagName;
// avoid fatal error if the content looks like '<html><body>You are being <a href="https://some.url">redirected</a>.</body></html>'
if (isset($output) && !is_array($output)) {
continue;
}
// assume more nodes of same kind are coming
if (!isset($output[$t])) {
$output[$t] = array();
}
$output[$t][] = $v;
} else {
//check if it is not an empty text node
if ($v !== '') {
$output = $v;
}
}
}
if (is_array($output)) {
// if only one node of its kind, assign it directly instead if array($value);
foreach ($output as $t => $v) {
if (is_array($v) && count($v) == 1) {
$output[$t] = $v[0];
}
}
if (empty($output)) {
//for empty nodes
$output = '';
}
}
// loop through the attributes and collect them
if ($node->attributes->length) {
$a = array();
foreach ($node->attributes as $attrName => $attrNode) {
$a[$attrName] = (string) $attrNode->value;
}
// if its an leaf node, store the value in @value instead of directly storing it.
if (!is_array($output)) {
$output = array(static::$prefix_attributes . 'value' => $output);
}
$output[static::$prefix_attributes . 'attributes'] = $a;
}
break;
}
return $output;
}