139 lines
3.0 KiB
PHP
139 lines
3.0 KiB
PHP
|
<?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)
|
||
|
{
|
||
|
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 .= convertValues($Data);
|
||
|
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 )
|
||
|
{
|
||
|
//$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 (!($fp = fopen($file, "r")))
|
||
|
{
|
||
|
die("could not open XML input");
|
||
|
}
|
||
|
|
||
|
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);
|
||
|
}
|
||
|
|
||
|
/*#######################################################################################*/
|
||
|
function getXMLsubPease( $Sourse, $Name )
|
||
|
{
|
||
|
while(list($key, $value) = each($Sourse->sub))
|
||
|
if( $value->name == $Name)
|
||
|
return $value;
|
||
|
|
||
|
echo "<h1>Fehler: getXMLsubPease( $Sourse, $Name ) not found</h1>";
|
||
|
die;
|
||
|
}
|
||
|
|
||
|
?>
|