diff --git a/src/Symfony/Component/Serializer/Encoder/XmlEncoder.php b/src/Symfony/Component/Serializer/Encoder/XmlEncoder.php index a091cfab69a07..4339d3fee2b4e 100644 --- a/src/Symfony/Component/Serializer/Encoder/XmlEncoder.php +++ b/src/Symfony/Component/Serializer/Encoder/XmlEncoder.php @@ -154,10 +154,13 @@ public function decode($data, $format, array $context = []) $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 && !\in_array($child->nodeType, $decoderIgnoredNodeTypes, true)) { + if (!$rootNode) { $rootNode = $child; } } diff --git a/src/Symfony/Component/Serializer/Tests/Encoder/XmlEncoderTest.php b/src/Symfony/Component/Serializer/Tests/Encoder/XmlEncoderTest.php index 0752021605b72..2d35bf43be736 100644 --- a/src/Symfony/Component/Serializer/Tests/Encoder/XmlEncoderTest.php +++ b/src/Symfony/Component/Serializer/Tests/Encoder/XmlEncoderTest.php @@ -587,6 +587,33 @@ public function testDecodeIgnoreComments() $this->assertEquals($expected, $this->encoder->decode($source, 'xml')); } + public function testDecodeIgnoreDocumentType() + { + $source = <<<'XML' + + + + + Benjamin + Alexandre + + + Damien + Clay + + +XML; + $expected = ['person' => [ + ['firstname' => 'Benjamin', 'lastname' => 'Alexandre'], + ['firstname' => 'Damien', 'lastname' => 'Clay'], + ]]; + $this->assertEquals($expected, $this->encoder->decode( + $source, + 'xml', + [XmlEncoder::DECODER_IGNORED_NODE_TYPES => [\XML_DOCUMENT_TYPE_NODE]] + )); + } + public function testDecodePreserveComments() { $this->doTestDecodePreserveComments();