/** * @param \DOMNode|Element $node * @param \DOMNode|Document|Element $target */ private function transferNode(\DOMNode $node, \DOMNode $target) { if ($node->namespaceURI === self::XMLNS_JSONX) { if ($target instanceof Document) { $normalizedName = $name = 'json:json'; } else { $name = $node->getAttribute('name'); $normalizedName = QualifiedName::normalizeString($name, self::DEFAULT_QNAME); } $type = $node->localName; $newNode = $target->appendElement($normalizedName); if ($name !== $normalizedName && $name !== '') { $newNode->setAttribute('json:name', $name); } switch ($type) { case 'object': if ($node('count(*) > 0')) { foreach ($node('*') as $childNode) { $this->transferNode($childNode, $newNode); } return; } break; case 'array': foreach ($node('*') as $childNode) { $this->transferNode($childNode, $newNode); } break; case 'string': $newNode->append((string) $node); return; default: $newNode->append((string) $node); break; } $newNode->setAttribute('json:type', $type); } }