153 lines
3.4 KiB
PHP
153 lines
3.4 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 .= 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;
|
|
}
|
|
}
|
|
// die;
|
|
}
|
|
|
|
/*#######################################################################################*/
|
|
function getXMLsubData($Sourse, $Name) {
|
|
$XML = getXMLsubPease($Sourse, $Name);
|
|
return $XML->data;
|
|
}
|
|
?>
|