4
4
namespace Soap \Encoding \Encoder ;
5
5
6
6
use Soap \Encoding \Xml \Node \Element ;
7
+ use Soap \Encoding \Xml \Node \ElementList ;
7
8
use Soap \Encoding \Xml \Writer \NilAttributeBuilder ;
8
9
use Soap \Encoding \Xml \Writer \XsdTypeXmlElementWriter ;
9
10
use VeeWee \Reflecta \Iso \Iso ;
10
11
use VeeWee \Xml \Xmlns \Xmlns ;
12
+ use function count ;
13
+ use function is_string ;
11
14
12
15
/**
13
16
* @template T of mixed
@@ -31,6 +34,7 @@ public function iso(Context $context): Iso
31
34
$ type = $ context ->type ;
32
35
$ meta = $ type ->getMeta ();
33
36
$ elementIso = $ this ->elementEncoder ->iso ($ context );
37
+ $ isList = $ meta ->isList ()->unwrapOr (false );
34
38
35
39
if (!$ meta ->isNullable ()->unwrapOr (false )) {
36
40
return $ elementIso ;
@@ -48,17 +52,27 @@ public function iso(Context $context): Iso
48
52
/**
49
53
* @return T|null
50
54
*/
51
- static function (Element |string $ xml ) use ($ elementIso ) : mixed {
55
+ static function (ElementList | Element |string $ xml ) use ($ elementIso, $ isList ) : mixed {
52
56
if ($ xml === '' ) {
53
57
return null ;
54
58
}
55
59
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 ' ) {
58
72
return null ;
59
73
}
60
74
61
- /** @var Iso<T|null, Element|non-empty-string> $elementIso */
75
+ /** @var Iso<T|null, ElementList| Element|non-empty-string> $elementIso */
62
76
return $ elementIso ->from ($ xml );
63
77
}
64
78
);
0 commit comments