<?php
class element {
	var $name = '';
	var $attributes = array ();
	var $data = '';
	var $depth = 0;
	var $sub = array ();
}

$XMLDEBUG = 0;
$depth = 0;
$XMLmain = new element;
$XMLpos = array (
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0
);
//$XMLpos = array( 0, 0, 0, 0, 0, 0);

function convertValues($Data) {
	global $XMLDEBUG;

	if ($XMLDEBUG) {
		$Data = htmlspecialchars($Data);
		$Data = mysql_escape_string($Data);
		$Data = htmlentities($Data);
	}

	$Data = utf8_decode($Data);
	return $Data;
}

function dataXMLmain($Data, & $Objekt, $Tiefe) {
	global $XMLmain, $XMLpos, $depth, $XMLDEBUG;

	if ($XMLDEBUG)
		echo "?$Tiefe$depth";

	if (($depth -1) == $Tiefe) {
		$Objekt->sub[$XMLpos[$Tiefe]]->data .= htmlentities(convertValues($Data), ENT_QUOTES);

		if ($XMLDEBUG)
			echo "???" . $Objekt->sub[$XMLpos[$Tiefe]]->name . "|$Data|$Tiefe???<br />";
	} else
		dataXMLmain($Data, $Objekt->sub[$XMLpos[$Tiefe]], $Tiefe +1);
}

function startXMLmain($Data, & $Objekt, $Tiefe) {
	global $XMLpos, $depth, $XMLDEBUG;

	if ($XMLDEBUG)
		if ($Tiefe == 1) {
			print_r(array_values($XMLpos));
			echo "--" . $Data->name;
			echo " #$Tiefe/$depth#";
		}

	if ($depth == $Tiefe) {
		$Objekt->sub[$XMLpos[$Tiefe]] = $Data;
		if ($XMLDEBUG)
			echo "|" . $XMLpos[$Tiefe] . "|" . $Objekt->sub[$XMLpos[$Tiefe]]->name . " " . $Data->name . " save|" . "#-#<br />";
	} else
		startXMLmain($Data, $Objekt->sub[$XMLpos[$Tiefe]], $Tiefe +1);
}

function start_element_handler($parser, $name, $attribs) {
	global $depth, $XMLmain, $XMLpos;

	$Data = new element;
	$Data->name = $name;
	while (list ($key, $value) = each($attribs))
		$Data->attributes[$key] = convertValues($value);
	$Data->depth = $depth;
	$XMLpos[$depth]++;

	if ($depth == 0)
		$XMLmain = $Data;
	else
		startXMLmain($Data, $XMLmain, 1);

	$depth++;
}

function end_element_handler($parser, $name) {
	global $depth, $XMLpos;
	$XMLpos[$depth] = 0;
	$depth--;
}

function character_data_handler($parser, $data) {
	global $XMLmain;
	if (strlen(trim($data)))
		dataXMLmain($data, $XMLmain, 1);
}

/*#######################################################################################*/
function readXMLfile($file) {
	global $XMLDEBUG;

	//$xml_parser = xml_parser_create_ns();
	$xml_parser = xml_parser_create("UTF-8");
	xml_set_element_handler($xml_parser, "start_element_handler", "end_element_handler");
	xml_set_character_data_handler($xml_parser, "character_data_handler");

	if (file_exists($file)) {
		if (!($fp = fopen($file, "r"))) {
			echo (" <h1>could not open XML file \"$file\"</h1>");
			return -1;
		}
	} else {
		echo (" <h1>XML file \"$file\" not exist</h1>");
		return -1;
	}

	if ($XMLDEBUG)
		echo "<pre>";
	while ($data = fread($fp, 4096)) {
		if (!xml_parse($xml_parser, $data, feof($fp))) {
			die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser)));
		}
	}
	if ($XMLDEBUG)
		echo "</pre>";
	xml_parser_free($xml_parser);
	return 0;
}

/*#######################################################################################*/
function getXMLsubPease($Sourse, $Name) {
	foreach ($Sourse->sub as $key => $value) {
		if ($value->name == $Name) {
			return $value;
		}
	}

	echo "<h1>Fehler: getXMLsubPease( $Sourse, $Name ) not found</h1>";
	//    die;  
}

/*#######################################################################################*/
function getXMLsubData($Sourse, $Name) {
	$XML = getXMLsubPease($Sourse, $Name);
	return $XML->data;
}
?>