function XmlEncoder::decode
Same name in this branch
- 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\EncoderCode
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);
}