Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. XmlEncoder.php

function XmlEncoder::decode

Same name in this branch
  1. 11.1.x core/modules/serialization/src/Encoder/XmlEncoder.php \Drupal\serialization\Encoder\XmlEncoder::decode()

Overrides DecoderInterface::decode

File

vendor/symfony/serializer/Encoder/XmlEncoder.php, line 105

Class

XmlEncoder
@author Jordi Boggiano <j.boggiano@seld.be> @author John Wards <jwards@whiteoctober.co.uk> @author Fabian Vogler <fabian@equivalence.ch> @author Kévin Dunglas <dunglas@gmail.com> @author Dany Maillard…

Namespace

Symfony\Component\Serializer\Encoder

Code

public function decode(string $data, string $format, array $context = []) : mixed {
    if ('' === trim($data)) {
        throw new NotEncodableValueException('Invalid XML data, it cannot be empty.');
    }
    $internalErrors = libxml_use_internal_errors(true);
    libxml_clear_errors();
    $dom = new \DOMDocument();
    $dom->loadXML($data, $context[self::LOAD_OPTIONS] ?? $this->defaultContext[self::LOAD_OPTIONS]);
    libxml_use_internal_errors($internalErrors);
    if ($error = libxml_get_last_error()) {
        libxml_clear_errors();
        throw new NotEncodableValueException($error->message);
    }
    $rootNode = null;
    $decoderIgnoredNodeTypes = $context[self::DECODER_IGNORED_NODE_TYPES] ?? $this->defaultContext[self::DECODER_IGNORED_NODE_TYPES];
    foreach ($dom->childNodes as $child) {
        if (\in_array($child->nodeType, $decoderIgnoredNodeTypes, true)) {
            continue;
        }
        if (\XML_DOCUMENT_TYPE_NODE === $child->nodeType) {
            throw new NotEncodableValueException('Document types are not allowed.');
        }
        if (!$rootNode) {
            $rootNode = $child;
        }
    }
    // todo: throw an exception if the root node name is not correctly configured (bc)
    if ($rootNode->hasChildNodes()) {
        $data = $this->parseXml($rootNode, $context);
        if (\is_array($data)) {
            $data = $this->addXmlNamespaces($data, $rootNode, $dom);
        }
        return $data;
    }
    if (!$rootNode->hasAttributes()) {
        return $rootNode->nodeValue;
    }
    $data = array_merge($this->parseXmlAttributes($rootNode, $context), [
        '#' => $rootNode->nodeValue,
    ]);
    return $this->addXmlNamespaces($data, $rootNode, $dom);
}
RSS feed
Powered by Drupal