HX3 Foren  

  HX3 Foren > Konstruktiv > Software- und Webentwicklung

Software- und Webentwicklung Planung, Programmierung und Administration
UML, JavaScript/DOM, ASP, JSP, PHP, Apache, MySQL, Python, Perl (...)

Antwort
 
Themen-Optionen Ansicht
Alt 21.11.2004, 15:18   #1 (permalink)
Administrator 10 Jahre hx3
5000 Beiträge
 
Benutzerbild von Atomic
 
Registriert seit: 21.02.2003
Ort: Freiburg im Breisgau
Alter: 33
Beiträge: 5.139
Atomic eine Nachricht über ICQ schicken Atomic eine Nachricht über Skype™ schicken
Standard 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:

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

PHP-Code:
 //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()); 
__________________
http://webagentur-walde.de/
Atomic ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Kontakt - HX3.de - Archiv - Nach oben

Angetrieben durch vBulletin, Entwicklung von Philipp Dörner & Tobias



SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116