PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PHP Klasse zur PHP2XML Serialisierung


Atomic
21.11.2004, 15:18
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:



Viel weniger Quellcode
Viel einfacher zu Bedienen
Voller PHP 5 Support
Unterstützung aller PHP Datentypen und Datenstrukturen
Und wie erreicht man solch eine hohe Qualität?
Ganz einfach man würgt sich nicht mit den Klasen und Objekt-Funktionen (http://www.php.net/manual/de/ref.classobj.php) einan ab sondern man formatiert einfach den Rückgabewert, der serialize() (http://www.php.net/manual/de/function.serialize.php)-Funktion, welche aus der Hand der Schöpfern von PHP höchstpersönlich stammt.

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

Die Sache hat nur einen Haken:
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:

//Also als erstes Bauen wir uns etwas möglichst komplexes zusammen:

class timmy{
private $xyz = array("zu"=>1.123);
}
class dummy{
protected $dummy;
function __construct(){
$this->dummy = new timmy();
}
}
class sub extends dummy{
var $name = 1.0;
}
$arr=array();
$arr["das gibts nicht"]=NULL;
$arr["ein string mit sonderzeichen"]="hj6&/%$§\"=)))";
$arr[]=new sub();
$arr[]=false;

define("MY_CONSTANT",12);
$arr[]=MY_CONSTANT;





//Serialisieren und ausgeben:
$dom = HX3_XMLSerialize($arr);
echo htmlspecialchars($dom->saveXML());