public static function parse($node, $deep = 0, $xPath = "", $verbose = false) { $ret_obj = []; $spaces = str_repeat(" ", $deep * 5); $count = count($node); $elements_count = []; if ($count > 0) { foreach ($node as $domElement) { $node_obj = []; $nodeName = $domElement->nodeName; $nodeValue = $domElement->nodeValue; $tagName = isset($domElement->tagName) ? $domElement->tagName : false; $parentNode = $domElement->parentNode; $was_verbose = $verbose; if (Parser::get_id($domElement) == "g-items-atf") { //$verbose = true; } // Generation of an absolute xPath $myPath = ""; if (isset($tagName)) { if (!isset($elements_count[$tagName])) { $elements_count[$tagName] = 1; } else { $elements_count[$tagName]++; } $myPath = $xPath . ($xPath == "" ? "descendant-or-self::" : "/") . $tagName . (Parser::tags_count($node, $tagName) > 1 ? "[position()=" . $elements_count[$tagName] . "]" : ""); } // Logging node by name with a tree structure $log_string = "[" . $deep . "]" . (strlen($deep . "") < 2 ? " " : ""); if ($deep == 0) { $log_string .= $nodeName; } else { if ($deep > 1) { $tmp_string = "|"; $tdeep = 0; while ($tdeep < $deep - 1) { $tmp_string .= str_repeat(" ", 4) . "|"; $tdeep++; } $log_string .= $tmp_string; } else { if ($deep == 1) { $log_string .= "|"; } } $log_string .= str_repeat("-", 4) . $nodeName; } if (get_class($domElement) == "DOMElement" && @(!!$domElement->getAttribute('id'))) { $log_string .= "[#" . $domElement->getAttribute('id') . "]"; } //$log_string .= "[".get_class( $domElement )."]"; if ($verbose) { Log::log($log_string); } $node_obj = ['name' => $nodeName, 'value' => "", 'parent' => "", 'node' => $domElement]; if ($tagName !== false) { $node_obj['tag'] = $tagName; } $children = Parser::parse($domElement->childNodes, $deep + 1, $myPath, $verbose); if (!!$children) { $node_obj['children'] = $children; } if ($myPath != "") { $node_obj['xPath'] = $myPath; } $ret_obj[] = $node_obj; } return $ret_obj; } else { return false; } }