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.

236 lines
5.9 KiB
PHP

<?php
/**************************************
/* Aus dem XML Sting wird automatisch eine Struktur aufbegaut
/* Die struktur wird von unten her aufgebaut, so wie die Felder im
/* xml-file heissen. Am besten man baut die Struktur lesbar auf,
/* Spezielle Formatierungen sind aber nicht erforderlich
/* also z.B.:
/* <menue>
/* <key>inhalt</key>
/* <txt>
/* <deu>deutsch</deu>
/* <eng>englisch</eng>
/* </txt>
/* </menue>
/*
/*
/* Hieraus wird eine struktur menue[key] = 'inhalt'
/* menue[txt][deu] = 'deutsch'
/* menue[txt][eng] = 'englisch'
/* aufgebaut.
/* jetzt mann man noch im XmlExclude ein Array mit dem Eintrag
/* 'txt' mitgeben und schon schaut die Struktur so aus:
/* menue[key] = 'inhalt'
/* menue[deu] = 'deutsch'
/* menue[eng] = 'englisch'
/* die Ebene 'txt' wird komplett weggeblendet
/* die erste nicht weggeblendete Ebene wird der Arraynamen, und jede weitere nicht weggeblendete ebene wird ein
/* assoziativen Arrays generiert.
/* Folgende Werte werdenrichtig erkannt:
/* true, false, null und parseInt(..) um eine numerische Variable zu erzeugen.
/*
/* Wird kein Wert eingegeben (<key></key>) wird das Feld mit '' gefüllt. Will man null drinnen haben, so ist das extra anzugeben.
/*
***************************************/
function XmlParse($XmlString,$XmlExclude){
$XmlStruk = null; // Basisname des Arrays
$Xmlebene = 0; // Momentane Aufrufebene
$Xmltab = array(); // Arrayname der Ebene
$varname = null;
if (strpos($XmlString,']') === false){
echo 'Xml-Phase Error1. No ] found';
exit;
}
$XmlString = substr($XmlString,strpos($XmlString,']'));
if (strpos($XmlString,'<') === false){
echo 'Xml-Phase Error1. No < found';
exit;
}
$XmlString = substr($XmlString,strpos($XmlString,'<'));
$retWert = lesenaechsteVar($XmlString);
/* Hauptscheife */
while(!$retWert['fertig']){
/* Variable wegschneiden */
$XmlString = substr($XmlString,$retWert['von']);
if ($retWert['ebene'] == '+'){
if (!inXmlExclude($retWert['var'],$XmlExclude)){
$Xmlebene = $Xmlebene + 1;
if ($Xmlebene == 1){
$XmlStruk = '$'.$retWert['var'];
eval('if (!isset('.$XmlStruk.')){global '.$XmlStruk.';'.$XmlStruk.'= "";}');
}else{
if ($Xmltab[$Xmlebene] == null && $XmlStruk != $retWert['var']){
$Xmltab[$Xmlebene] = '["'.$retWert['var'].'"]';
}
$Xmlvar = $XmlStruk;
for ($j=0;$j<=$Xmlebene;$j++){
if ($Xmltab[$j] != null){
$Xmlvar .= $Xmltab[$j];
}
}
eval('if (!isset('.$Xmlvar.')){'.$Xmlvar.'= "";}');
}
}else{
$Xmltab[$Xmlebene] = null;
}
}
if ($retWert['ebene'] == ''){
if (!inXmlExclude($retWert['var'],$XmlExclude)){
$Xmlvar = $XmlStruk;
for ($j=0;$j<=$Xmlebene;$j++){
if ($Xmltab[$j] != null){
$Xmlvar .= $Xmltab[$j];
}
}
$Xmlvar .= '["'.$retWert['var'].'"]';
eval('if (!isset('.$Xmlvar.')){'.$Xmlvar.'= array();}');
switch($retWert['wert']){
case 'null':
$XmlvarWert = $Xmlvar . ',null);';
break;
case 'true':
$XmlvarWert = $Xmlvar . ',true);';
break;
case 'false':
$XmlvarWert = $Xmlvar . ',false);';
break;
default:
if (substr($retWert['wert'],0,9) == 'parseInt('){
$XmlvarWert = $Xmlvar . ",str_replace(array(')','parseInt('),'',".'$retWert["wert"]));';
}else{
$XmlvarWert = $Xmlvar . ',"'.$retWert["wert"].'");';
}
}
eval ('array_push('.$XmlvarWert);
}
}
if ($retWert['ebene'] == '-'){
if (!inXmlExclude($retWert['var'],$XmlExclude)){
$Xmltab[$Xmlebene] = null;
$Xmlebene = $Xmlebene - 1;
}
}
$retWert = lesenaechsteVar($XmlString);
}
}
/* Exclude überprüfen */
function inXmlExclude($u_var,$u_exclude){
for($i=0;$i<count(u_exclude);$i++){
if ($u_exclude[$i] == $u_var){
return true;
}
}
return false;
}
/* Nächst Variable holen */
function lesenaechsteVar($XmlString){
$xplus = 0;
while (substr($XmlString,strpos('<',$XmlString),4) == '<!--'){
$xplus += strpos($XmlString,'-->')+3;
$XmlString = substr($XmlString,strpos($XmlString,'-->')+3);
$xplus += strpos($XmlString,'<');
$XmlString = substr($XmlString,strpos($XmlString,'<'));
}
$retWert = array();
$von = strpos($XmlString,'<');
$bis = strpos($XmlString,'>')-1;
$retWert['fertig'] = false;
if ($von === false){ // Ende Erreicht
$retWert['fertig'] = true;
}else{
if ($bis == -1){ // Ende Erreicht
echo 'Xml-Phase Error 2. No > found';
$retWert['fertig'] = true;
}else{
$testString = substr($XmlString,1);
// Ebene runter
if (substr($XmlString,1,1) == '/'){
$retWert['ebene'] = '-';
$retWert['von'] = returnWert($testString) + $xplus;
}else{
$retWert['var'] = substr($XmlString,$von+1,$bis);
// Ebene finden und Variablenwert holen
$nextpos = strpos($testString,'<');
if (substr($testString,$nextpos+1,1) == '/'){
$retWert['ebene'] = '';
$wertString = substr($XmlString,$bis+2);
$retWert['wert'] = substr($wertString,0,strpos($wertString,'</'));
$retWert['von'] = returnWert($testString) + $xplus;
}else{ // Ebene rauf
$retWert['ebene'] = '+';
$retWert['von'] = returnWert($testString) + $xplus;
}
}
}
}
return $retWert;
}
function returnWert($testString){
$retWert = strpos($testString,'<');
if ($retWert === false){
$retWert = strlen($testString)+1;
}else{
$retWert++;
if (substr($testString,$retWert,1) == '/' && substr($testString,0,1) != '/'){
$testString1 = substr($testString,$retWert + 1);
$retWert1 = strpos($testString1,'<') + 1;
if ($retWert1 == -1){
$retWert1 = strlen($testString) + 1;
}
$retWert = $retWert + $retWert1 + 1;
}
}
return $retWert;
}
function getXmlfile($u_file,$u_Exclude){
$mfile = fopen($u_file, 'r');
if (!$u_file){
errorlog ("Konnte '".$u_file."' nicht öffen");
exit;
}
$XmlString = fread($mfile,filesize($u_file));
XmlParse($XmlString,$u_Exclude);
fclose($mfile);
}
?>