xml_obj = xml_parser_create(); xml_set_object($this->xml_obj,$this); xml_set_character_data_handler($this->xml_obj, 'dataHandler'); xml_set_element_handler($this->xml_obj, "startHandler", "endHandler"); } // *** ---------------------------------------------------------------- function parse($path){ if (!($fp = fopen($path, "r"))) { die("Cannot open XML data file: $path"); return false; } while ($data = fread($fp, 4096)) { if (!xml_parse($this->xml_obj, $data, feof($fp))) { die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($this->xml_obj)), xml_get_current_line_number($this->xml_obj))); xml_parser_free($this->xml_obj); } } return true; } // *** ---------------------------------------------------------------- function startHandler($parser, $name, $attribs){ $_content = array('name' => $name); if(!empty($attribs)) $_content['attrs'] = $attribs; array_push($this->output, $_content); } // *** ---------------------------------------------------------------- function dataHandler($parser, $data){ if(!empty($data)) { $_output_idx = count($this->output) - 1; $this->output[$_output_idx]['content'] = $data; } } // *** ---------------------------------------------------------------- function endHandler($parser, $name){ if(count($this->output) > 1) { $_data = array_pop($this->output); $_output_idx = count($this->output) - 1; $this->output[$_output_idx]['child'][] = $_data; } } // *** ---------------------------------------------------------------- function GetNodeByPath($path,$tree = false) { if ($tree) { $tree_to_search = $tree; } else { $tree_to_search = $this->output; } if ($path == "") { return null; } $arrPath = explode('/',$path); foreach($tree_to_search as $key => $val) { if (gettype($val) == "array") { $nodename = $val[name]; if ($nodename == $arrPath[0]) { if (count($arrPath) == 1) { return $val; } array_shift($arrPath); $new_path = implode($arrPath,"/"); return $this->GetNodeByPath($new_path,$val[child]); } } } } } // class : end ?>