44namespace Soap \Encoding \Encoder ;
55
66use Soap \Encoding \Xml \Node \Element ;
7+ use Soap \Encoding \Xml \Node \ElementList ;
78use Soap \Encoding \Xml \Writer \NilAttributeBuilder ;
89use Soap \Encoding \Xml \Writer \XsdTypeXmlElementWriter ;
910use VeeWee \Reflecta \Iso \Iso ;
1011use VeeWee \Xml \Xmlns \Xmlns ;
12+ use function count ;
13+ use function is_string ;
1114
1215/**
1316 * @template T of mixed
@@ -31,6 +34,7 @@ public function iso(Context $context): Iso
3134 $ type = $ context ->type ;
3235 $ meta = $ type ->getMeta ();
3336 $ elementIso = $ this ->elementEncoder ->iso ($ context );
37+ $ isList = $ meta ->isList ()->unwrapOr (false );
3438
3539 if (!$ meta ->isNullable ()->unwrapOr (false )) {
3640 return $ elementIso ;
@@ -48,17 +52,27 @@ public function iso(Context $context): Iso
4852 /**
4953 * @return T|null
5054 */
51- static function (Element |string $ xml ) use ($ elementIso ) : mixed {
55+ static function (ElementList | Element |string $ xml ) use ($ elementIso, $ isList ) : mixed {
5256 if ($ xml === '' ) {
5357 return null ;
5458 }
5559
56- $ documentElement = ($ xml instanceof Element ? $ xml : Element::fromString ($ xml ))->element ();
57- if ($ documentElement ->getAttributeNS (Xmlns::xsi ()->value (), 'nil ' ) === 'true ' ) {
60+ $ parsedXml = match (true ) {
61+ $ isList && is_string ($ xml ) => ElementList::fromString ('<list> ' .$ xml .'</list> ' ),
62+ is_string ($ xml ) => Element::fromString ($ xml ),
63+ default => $ xml ,
64+ };
65+
66+ $ documentElement = match (true ) {
67+ $ parsedXml instanceof ElementList && count ($ parsedXml ) === 1 => $ parsedXml ->elements ()[0 ]->element (),
68+ $ parsedXml instanceof Element => $ parsedXml ->element (),
69+ default => null
70+ };
71+ if ($ documentElement && $ documentElement ->getAttributeNS (Xmlns::xsi ()->value (), 'nil ' ) === 'true ' ) {
5872 return null ;
5973 }
6074
61- /** @var Iso<T|null, Element|non-empty-string> $elementIso */
75+ /** @var Iso<T|null, ElementList| Element|non-empty-string> $elementIso */
6276 return $ elementIso ->from ($ xml );
6377 }
6478 );
0 commit comments