diff --git a/src/Shared/Soap/ZipMessageDecoder.php b/src/Shared/Soap/ZipMessageDecoder.php index ff258f3..332b196 100644 --- a/src/Shared/Soap/ZipMessageDecoder.php +++ b/src/Shared/Soap/ZipMessageDecoder.php @@ -35,9 +35,14 @@ final class ZipMessageDecoder @unlink($tempFile); } - $previous = libxml_use_internal_errors(true); - $simpleXml = simplexml_load_string($xml); - libxml_use_internal_errors($previous); + $previous = libxml_use_internal_errors(true); + + try { + $simpleXml = simplexml_load_string($xml); + } finally { + libxml_clear_errors(); + libxml_use_internal_errors($previous); + } if (false === $simpleXml) { throw new RuntimeException('ZipMessageDecoder: XML invalide dans l\'archive ZIP.'); diff --git a/tests/Unit/Shared/Soap/ZipMessageDecoderTest.php b/tests/Unit/Shared/Soap/ZipMessageDecoderTest.php index e371b30..4a7b33c 100644 --- a/tests/Unit/Shared/Soap/ZipMessageDecoderTest.php +++ b/tests/Unit/Shared/Soap/ZipMessageDecoderTest.php @@ -32,6 +32,24 @@ final class ZipMessageDecoderTest extends TestCase self::assertSame('F', (string) $decoded->Bovins->Bovin->IdentiteBovin->Sexe); } + public function testDecodeProducesArrayForMultiChildNodes(): void + { + $xml = '' + .'' + .'' + .'F' + .'M' + .'' + .''; + + $decoded = new ZipMessageDecoder()->decode($this->makeZipBinary('message.xml', $xml)); + + self::assertIsArray($decoded->Bovins->Bovin); + self::assertCount(2, $decoded->Bovins->Bovin); + self::assertSame('F', (string) $decoded->Bovins->Bovin[0]->IdentiteBovin->Sexe); + self::assertSame('M', (string) $decoded->Bovins->Bovin[1]->IdentiteBovin->Sexe); + } + public function testDecodeThrowsOnEmptyBinary(): void { $this->expectException(RuntimeException::class);