if (!defined('SHOP_TO_DATE')) die(HTTP_FORBIDDEN); class xmldata { var $xml; var $actual_node = array(); // Konstruktor, erstellt Datenstruktur aus gegebener XML Struktur function xmldata($data) { // Rekursiver Parser function parse_rec($data) { if (preg_match_all('/<([a-z_0-9]+)>([\s\S]*?)<\/\\1>/', $data, $parts)) { $help_arr = array(); $help = null; for ($i = 0; $i < count($parts[0]); $i++) { $inner = parse_rec($parts[2][$i]); if (gettype($inner) == 'string') $help->$parts[1][$i] = $inner; else { if (!isset($help->$parts[1][$i])) $help->$parts[1][$i] = array(); array_push($help->$parts[1][$i], $inner); } } return $help; } else return $data; } $this->xml = parse_rec($data); array_unshift($this->actual_node, $this->xml); } // Eine Ebene tiefer gehen function deeper($nodename) { $actual = $this->get_actual_node(); if (isset($actual->$nodename)) { array_unshift($this->actual_node, $actual->$nodename); return true; } else return false; } // Eine Eben höher gehen function higher() { array_shift($this->actual_node); } // Auf derselben Ebene einen Knoten weiter gehen function next_child() { return next($this->actual_node[0]); } // Element auslesen und dabei validieren function get($nodename, $check) { global $x2dws; $actual = $this->get_actual_node(); if (gettype($check) == 'array') { if (!in_array($actual->$nodename, $check)) $x2dws->error_response("Value for [$nodename] not supported"); } else if ($check && !preg_match($check, $actual->$nodename)) $x2dws->error_response("Value for [$nodename] not mathing $check"); return xml_decode($actual->$nodename); } // Element auslesen, validieren und auf Null prüfen function getornull($nodename, $check) { $value = $this->get($nodename, $check); if ($value !== '') return $value; else return null; } // Überprüfen ob bestimmte Knoten vorhanden sind function check_nodes($nodes, $check_complete) { global $x2dws; $actual = $this->get_actual_node(); foreach($nodes as $n) if (!isset($actual->$n)) $x2dws->error_response("Missing node [$n]"); // Fehler ausgeben, wenn andere Knoten vorhanden sind if ($check_complete) foreach($actual as $k => $v) if (!in_array($k, $nodes)) $x2dws->error_response("Unknown node [$k]"); } // Rückmeldung ob ein Knoten vorhanden sind function is_node($nodename) { $actual = $this->get_actual_node(); if (isset($actual->$nodename)) return true; else return false; } // PRIVAT Aktuelle Eben/Knoten ermitteln function get_actual_node() { global $x2dws; $actual = &$this->actual_node[0]; if (gettype($actual) == 'array') return current($actual); else if (gettype($actual) == 'object') return $actual; else $x2dws->error_response('Invalid XML structure'); } // Aktuellen Knoten rausgeben function get_content() { global $x2dws; $actual = &$this->actual_node[0]; if (gettype($actual) == 'array') $content = current($actual); else if (gettype($actual) == 'object') $content = $actual; else $x2dws->error_response('Invalid XML structure'); foreach (get_object_vars($content) as $key => $value) $new_content->$key = xml_decode($value); return $new_content; } } ?>