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
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);
|
|
}
|
|
?>
|