|
Software- und Webentwicklung Planung, Programmierung und Administration
UML, JavaScript/DOM, ASP, JSP, PHP, Apache, MySQL, Python, Perl (...) |
|
Themen-Optionen | Ansicht |
21.11.2004, 16:18 | #1 (permalink) |
|
PHP Klasse zur PHP2XML Serialisierung
Nachdem Dr. Doom mal einen seiner Quellcodes veröffentlicht hat lasse ich mich auch nicht Lumpen und gib auch etwas frei ^^
Wenn man PHP Daten übertragen möchte muss man ihnen Form verleihen. Das XML-Format ist für den Austausch von Daten wie Html für das anzeigen von Websiten nicht mehr wegzudenken. Von PEAR gibt es bereits eine Klasse die genau diese Funktionalität besitzt. Aber das Ding ist ein einziger Witz. Die Vorteile meiner Lösung:
Ganz einfach man würgt sich nicht mit den Klasen und Objekt-Funktionen einan ab sondern man formatiert einfach den Rückgabewert, der serialize()-Funktion, welche aus der Hand der Schöpfern von PHP höchstpersönlich stammt. Code:
<?php /** * HX3_XMLSerialize * Like the PHP serialize()-Function, but in XML-format * * @author Herbert Walde aka Atomic * @version 1.0 * @copyright 2004 www.hx3.de */ class HX3_XMLSerialize { private $dom; function __construct($var, $root_tag_name = "") { // Teil 1: PHP Serialisierungs String verarbeiten $str = serialize($var); $y = 0; $max = strlen($str); $buffer = ""; $arr = array(); while ($y < $max) { switch ($str[$y]) { case ";": $arr[] = array(0, $buffer); $buffer = ""; break; case "{": $arr[] = array(1, substr($buffer, 0, -1)); $buffer = ""; break; case "}": $arr[] = array(2, $buffer); $buffer = ""; break; default: $buffer .= $str[$y]; break; } $y++; } $x = 0; $max2 = count($arr); while ($x < $max2) { $str = $arr[$x][1]; $varr = array(); $varr["char"] = $str[0]; $times = ""; $y = 2; $max = strlen($str); while ($y < $max && $str[$y] != ":") { $times .= $str[$y]; $y++; } if ($varr["char"] == "i" || $varr["char"] == "d" || $varr["char"] == "b") $varr["value"] = $times; $y++; if ($y <= $max) { $name = ""; $i = 0; $is_string = false; if ($str[$y] == "\"") { $y++; $is_string = true; } $times = (int)$times; while ($i < $times) { $name .= $str[$y]; $y++; $i++; } if ($is_string) $y++; switch ($varr["char"]) { case "s": $varr["value"] = $name; break; case "O": $varr["name"] = $name; break; default: die("Error: item:char not defined: \"" . $varr["char"] . "\""); break; } } switch ($arr[$x][0]) { case 0: $arr[$x][1] = $varr; break; case 1: $arr[$x][1] = $varr; break; case 2: // - break; } $x++; } // Teil 2 - XML Dokument Aufbauen $dom = new DomDocument(); $elements = array(); if (empty($root_tag_name)) $elements[0] = $dom->createElement("HX3_XMLVar"); else $elements[0] = $dom->createElement($root_tag_name); $i = 0; // Index von $elements $type_arr = array(); $type_arr[] = ""; $name_arr = array(); $deph_arr = array(); $deph_arr[] = $i; // jeweils die parent $i $d = 0; // die tiefe $y = 0; $max = count($arr); $in_array = false; $in_object = false; $first = false; $last_id = 0; while ($y < $max) { switch ($arr[$y][0]) { case 0: switch ($arr[$y][1]["char"]) { case "s": if ($in_array || $in_object) { if ($first) { $first = false; $i++; if ($in_array) { $elements[$i] = $dom->createElement("index"); $elements[$i]->setAttribute("key", $arr[$y][1]["value"]); } else { $elements[$i] = $dom->createElement("property"); if (strstr ($arr[$y][1]["value"], chr(0) . "*" . chr(0))) { $elements[$i]->setAttribute("type", "protected"); $elements[$i]->setAttribute("name", str_replace(chr(0) . "*" . chr(0), "", $arr[$y][1]["value"])); } else if (strstr ($arr[$y][1]["value"], chr(0) . $name_arr[$d] . chr(0))) { $elements[$i]->setAttribute("type", "private"); $elements[$i]->setAttribute("name", str_replace(chr(0) . $name_arr[$d] . chr(0), "", $arr[$y][1]["value"])); } else { $elements[$i]->setAttribute("type", "public"); $elements[$i]->setAttribute("name", $arr[$y][1]["value"]); } } $last_id = $i; } else { $first = true; $i++; $elements[$i] = $dom->createElement("string"); $elements[$i]->appendChild($dom->createTextNode($arr[$y][1]["value"])); $elements[$last_id]->appendChild($elements[$i]); $elements[($deph_arr[$d])]->appendChild($elements[$last_id]); } } else { $i++; $elements[$i] = $dom->createElement("string"); $elements[$i]->appendChild($dom->createTextNode($arr[$y][1]["value"])); $elements[($deph_arr[$d])]->appendChild($elements[$i]); } break; case "i": if ($in_array || $in_object) { if ($first) { $first = false; $i++; $elements[$i] = $dom->createElement("index"); $elements[$i]->setAttribute("id", $arr[$y][1]["value"]); $last_id = $i; } else { $first = true; $i++; $elements[$i] = $dom->createElement("integer"); $elements[$i]->appendChild($dom->createTextNode($arr[$y][1]["value"])); $elements[$last_id]->appendChild($elements[$i]); $elements[($deph_arr[$d])]->appendChild($elements[$last_id]); } } else { $i++; $elements[$i] = $dom->createElement("integer"); $elements[$i]->appendChild($dom->createTextNode($arr[$y][1]["value"])); $elements[($deph_arr[$d])]->appendChild($elements[$i]); } break; case "d": if ($in_array || $in_object) { $first = true; $i++; $elements[$i] = $dom->createElement("float"); $elements[$i]->appendChild($dom->createTextNode($arr[$y][1]["value"])); $elements[$last_id]->appendChild($elements[$i]); $elements[($deph_arr[$d])]->appendChild($elements[$last_id]); } else { $i++; $elements[$i] = $dom->createElement("float"); $elements[$i]->appendChild($dom->createTextNode($arr[$y][1]["value"])); $elements[($deph_arr[$d])]->appendChild($elements[$i]); } break; case "b": if ($arr[$y][1]["value"] === "1") { $arr[$y][1]["value"] = "true"; } else { $arr[$y][1]["value"] = "false"; } if ($in_array || $in_object) { $first = true; $i++; $elements[$i] = $dom->createElement("boolean"); $elements[$i]->appendChild($dom->createTextNode($arr[$y][1]["value"])); $elements[$last_id]->appendChild($elements[$i]); $elements[($deph_arr[$d])]->appendChild($elements[$last_id]); } else { $i++; $elements[$i] = $dom->createElement("boolean"); $elements[$i]->appendChild($dom->createTextNode($arr[$y][1]["value"])); $elements[($deph_arr[$d])]->appendChild($elements[$i]); } break; case "N": if ($in_array || $in_object) { $first = true; $i++; $elements[$i] = $dom->createElement("null"); $elements[$last_id]->appendChild($elements[$i]); $elements[($deph_arr[$d])]->appendChild($elements[$last_id]); } else { $i++; $elements[$i] = $dom->createElement("null"); $elements[($deph_arr[$d])]->appendChild($elements[$i]); } break; } break; case 1: switch ($arr[$y][1]["char"]) { case "O": if ($in_array || $in_object) { $i++; $elements[$i] = $dom->createElement("name"); $elements[$i]->appendChild($dom->createTextNode($arr[$y][1]["name"])); $i++; $elements[$i] = $dom->createElement("object"); $elements[$i]->appendChild($elements[($i-1)]); $elements[$last_id]->appendChild($elements[$i]); $elements[($deph_arr[$d])]->appendChild($elements[$last_id]); $d++; $deph_arr[$d] = $i; $type_arr[$d] = "O"; $name_arr[$d] = $arr[$y][1]["name"]; } else { $i++; $elements[$i] = $dom->createElement("name"); $elements[$i]->appendChild($dom->createTextNode($arr[$y][1]["name"])); $i++; $elements[$i] = $dom->createElement("object"); $elements[$i]->appendChild($elements[($i-1)]); $elements[($deph_arr[$d])]->appendChild($elements[$i]); $d++; $deph_arr[$d] = $i; $type_arr[$d] = "O"; $name_arr[$d] = $arr[$y][1]["name"]; } $in_array = false; $in_object = true; $first = true; break; case "a": if ($in_array || $in_object) { $i++; $elements[$i] = $dom->createElement("array"); $elements[$last_id]->appendChild($elements[$i]); $elements[($deph_arr[$d])]->appendChild($elements[$last_id]); $d++; $deph_arr[$d] = $i; $type_arr[$d] = "a"; } else { $i++; $elements[$i] = $dom->createElement("array"); $elements[($deph_arr[$d])]->appendChild($elements[$i]); $d++; $deph_arr[$d] = $i; $type_arr[$d] = "a"; } $in_array = true; $in_object = false; $first = true; break; } break; case 2: $d--; $in_object = false; $in_array = false; if ($type_arr[$d] == "O") { $in_object = true; } if ($type_arr[$d] == "a") { $in_array = true; } break; } $y++; } if (empty($root_tag_name)) $dom->appendChild($elements[1]); else $dom->appendChild($elements[0]); $this->dom = $dom; } public function GetDOM(){ return $this->dom; } public function GetXML(){ return $this->dom->saveHTML() } } ?> Ich bin bis jetzt noch nicht dazugekommen eine Klasse zu schreiben die XML wieder zu PHP zurückwandelt. Aber mit der PHP 5 Reflection API sollte das machbar sein. Die Anwendung ist einfach: PHP-Code:
__________________
https://savetheinternet.info/ |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
Themen-Optionen | |
Ansicht | |
|
|