You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

150 lines
3.3 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)
{
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 .= 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 )
{
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 (!($fp = fopen($file, "r")))
{
echo(" <h1>could not open XML file \"$file\"</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 )
{
while(list($key, $value) = each($Sourse->sub))
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;
}
?>