* @author Stephan Wentz * @author Michael Garvin * @author Alexander Birkner (https://github.com/BirknerAlex) * @author zorn-v (https://github.com/zorn-v/xmpphp/) * @author GNU social * @copyright 2008 Nathanael C. Fritz */ namespace XMPPHP; /** * XMPPHP XMLObject * * @package XMPPHP * @author Nathanael C. Fritz * @author Stephan Wentz * @author Michael Garvin * @copyright 2008 Nathanael C. Fritz * @version $Id$ */ class XMLObj { /** * Tag name * * @var string */ public $name; /** * Namespace * * @var string */ public $ns; /** * Attributes * * @var array */ public $attrs = []; /** * Subs? * * @var array */ public $subs = []; /** * Node data * * @var string */ public $data = ''; /** * Constructor * * @param string $name * @param string $ns (optional) * @param array $attrs (optional) * @param string $data (optional) */ public function __construct(string $name, string $ns = '', array $attrs = [], string $data = '') { $this->name = strtolower($name); $this->ns = $ns; if (is_array($attrs) && count($attrs)) { foreach ($attrs as $key => $value) { $this->attrs[strtolower($key)] = $value; } } $this->data = $data; } /** * Dump this XML Object to output. * * @param int $depth (optional) */ public function printObj(int $depth = 0): void { print str_repeat("\t", $depth) . $this->name . " " . $this->ns . ' ' . $this->data; print "\n"; foreach ($this->subs as $sub) { $sub->printObj($depth + 1); } } /** * Return this XML Object in xml notation * * @param string $str (optional) * @return string */ public function toString(string $str = ''): string { $str .= "<{$this->name} xmlns='{$this->ns}' "; foreach ($this->attrs as $key => $value) { if ($key != 'xmlns') { $value = htmlspecialchars($value); $str .= "$key='$value' "; } } $str .= ">"; foreach ($this->subs as $sub) { $str .= $sub->toString(); } $body = htmlspecialchars($this->data); $str .= "$bodyname}>"; return $str; } /** * Has this XML Object the given sub? * * @param string $name * @param string|null $ns * @return bool */ public function hasSub(string $name, ?string $ns = null): bool { foreach ($this->subs as $sub) { if (($name == "*" or $sub->name == $name) and ($ns == null or $sub->ns == $ns)) { return true; } } return false; } /** * Return a sub * * @param string $name * @param string|null $ns (optional) * @param array|null $attrs (optional) * @return mixed */ public function sub(string $name, ?string $ns = null, ?array $attrs = null) { // @todo attrs is ignored foreach ($this->subs as $sub) { if ($sub->name === $name && (is_null($ns) || $sub->ns === $ns)) { return $sub; } } return null; } }