@@ -68,7 +68,6 @@ class XmlEncoder implements EncoderInterface, DecoderInterface, NormalizationAwa
68
68
/**
69
69
* @var \DOMDocument
70
70
*/
71
- private $ dom ;
72
71
private $ format ;
73
72
private $ context ;
74
73
@@ -90,19 +89,19 @@ public function encode($data, string $format, array $context = [])
90
89
91
90
$ xmlRootNodeName = $ context [self ::ROOT_NODE_NAME ] ?? $ this ->defaultContext [self ::ROOT_NODE_NAME ];
92
91
93
- $ this -> dom = $ this ->createDomDocument ($ context );
92
+ $ dom = $ this ->createDomDocument ($ context );
94
93
$ this ->format = $ format ;
95
94
$ this ->context = $ context ;
96
95
97
96
if (null !== $ data && !is_scalar ($ data )) {
98
- $ root = $ this -> dom ->createElement ($ xmlRootNodeName );
99
- $ this -> dom ->appendChild ($ root );
97
+ $ root = $ dom ->createElement ($ xmlRootNodeName );
98
+ $ dom ->appendChild ($ root );
100
99
$ this ->buildXml ($ root , $ data , $ xmlRootNodeName );
101
100
} else {
102
- $ this ->appendNode ($ this -> dom , $ data , $ xmlRootNodeName );
101
+ $ this ->appendNode ($ dom , $ data , $ xmlRootNodeName );
103
102
}
104
103
105
- return $ this -> dom ->saveXML ($ ignorePiNode ? $ this -> dom ->documentElement : null );
104
+ return $ dom ->saveXML ($ ignorePiNode ? $ dom ->documentElement : null );
106
105
}
107
106
108
107
/**
@@ -197,7 +196,7 @@ public function supportsDecoding(string $format)
197
196
final protected function appendXMLString (\DOMNode $ node , string $ val ): bool
198
197
{
199
198
if ('' !== $ val ) {
200
- $ frag = $ this -> dom ->createDocumentFragment ();
199
+ $ frag = $ node -> ownerDocument ->createDocumentFragment ();
201
200
$ frag ->appendXML ($ val );
202
201
$ node ->appendChild ($ frag );
203
202
@@ -209,15 +208,15 @@ final protected function appendXMLString(\DOMNode $node, string $val): bool
209
208
210
209
final protected function appendText (\DOMNode $ node , string $ val ): bool
211
210
{
212
- $ nodeText = $ this -> dom ->createTextNode ($ val );
211
+ $ nodeText = $ node -> ownerDocument ->createTextNode ($ val );
213
212
$ node ->appendChild ($ nodeText );
214
213
215
214
return true ;
216
215
}
217
216
218
217
final protected function appendCData (\DOMNode $ node , string $ val ): bool
219
218
{
220
- $ nodeText = $ this -> dom ->createCDATASection ($ val );
219
+ $ nodeText = $ node -> ownerDocument ->createCDATASection ($ val );
221
220
$ node ->appendChild ($ nodeText );
222
221
223
222
return true ;
@@ -239,7 +238,7 @@ final protected function appendDocumentFragment(\DOMNode $node, $fragment): bool
239
238
240
239
final protected function appendComment (\DOMNode $ node , string $ data ): bool
241
240
{
242
- $ node ->appendChild ($ this -> dom ->createComment ($ data ));
241
+ $ node ->appendChild ($ node -> ownerDocument ->createComment ($ data ));
243
242
244
243
return true ;
245
244
}
@@ -442,7 +441,15 @@ private function buildXml(\DOMNode $parentNode, $data, string $xmlRootNodeName =
442
441
*/
443
442
private function appendNode (\DOMNode $ parentNode , $ data , string $ nodeName , string $ key = null ): bool
444
443
{
445
- $ node = $ this ->dom ->createElement ($ nodeName );
444
+ $ dom = null ;
445
+ if ($ parentNode instanceof \DomDocument) {
446
+ $ dom = $ parentNode ;
447
+ }
448
+ else {
449
+ $ dom = $ parentNode ->ownerDocument ;
450
+ }
451
+
452
+ $ node = $ dom ->createElement ($ nodeName );
446
453
if (null !== $ key ) {
447
454
$ node ->setAttribute ('key ' , $ key );
448
455
}
@@ -473,12 +480,12 @@ private function selectNodeType(\DOMNode $node, $val): bool
473
480
if (\is_array ($ val )) {
474
481
return $ this ->buildXml ($ node , $ val );
475
482
} elseif ($ val instanceof \SimpleXMLElement) {
476
- $ child = $ this -> dom ->importNode (dom_import_simplexml ($ val ), true );
483
+ $ child = $ node -> ownerDocument ->importNode (dom_import_simplexml ($ val ), true );
477
484
$ node ->appendChild ($ child );
478
485
} elseif ($ val instanceof \Traversable) {
479
486
$ this ->buildXml ($ node , $ val );
480
487
} elseif ($ val instanceof \DOMNode) {
481
- $ child = $ this -> dom ->importNode ($ val , true );
488
+ $ child = $ node -> ownerDocument ->importNode ($ val , true );
482
489
$ node ->appendChild ($ child );
483
490
} elseif (\is_object ($ val )) {
484
491
if (null === $ this ->serializer ) {
0 commit comments