public function namespaces($namespaces = NULL)
{
if (isset($namespaces)) {
$this->_namespaces = [];
if ($namespaces instanceof \DOMElement) {
$xpath = new Xpath($namespaces->ownerDocument);
$namespaces = $xpath('namespace::*', $namespaces);
}
if (is_array($namespaces) || $namespaces instanceof \Traversable) {
foreach ($namespaces as $key => $namespace) {
if ($namespace instanceof \DOMNameSpaceNode) {
if ($namespace->nodeName === 'xmlns') {
$this->registerNamespace('#default', $namespace->nodeValue);
} elseif ($namespace->localName != 'xml') {
$this->registerNamespace($namespace->localName, $namespace->nodeValue);
}
} else {
$this->registerNamespace($key, $namespace);
}
}
} elseif (isset($namespaces)) {
throw new \InvalidArgumentException('$namespaces needs to be a list of namespaces or an element node to fetch the namespaces from.');
}
}
return empty($this->_namespaces) ? $this->ownerDocument->namespaces() : $this->_namespaces;
}