@@ -26,24 +26,36 @@ class XmlEncoder extends SerializerAwareEncoder implements EncoderInterface, Dec
2626 private $ format ;
2727 private $ rootNodeName = 'response ' ;
2828
29+ /**
30+ * Construct new XmlEncoder and allow to change the root node element name.
31+ *
32+ * @param string $rootNodeName
33+ */
34+ public function __construct ($ rootNodeName = 'response ' )
35+ {
36+ $ this ->rootNodeName = $ rootNodeName ;
37+ }
38+
2939 /**
3040 * {@inheritdoc}
3141 */
32- public function encode ($ data , $ format )
42+ public function encode ($ data , $ format, array $ context = array () )
3343 {
3444 if ($ data instanceof \DOMDocument) {
3545 return $ data ->saveXML ();
3646 }
3747
48+ $ xmlRootNodeName = $ this ->resolveXmlRootName ($ context );
49+
3850 $ this ->dom = new \DOMDocument ();
3951 $ this ->format = $ format ;
4052
4153 if (null !== $ data && !is_scalar ($ data )) {
42- $ root = $ this ->dom ->createElement ($ this -> getRealRootNodeName () );
54+ $ root = $ this ->dom ->createElement ($ xmlRootNodeName );
4355 $ this ->dom ->appendChild ($ root );
44- $ this ->buildXml ($ root , $ data );
56+ $ this ->buildXml ($ root , $ data, $ xmlRootNodeName );
4557 } else {
46- $ this ->appendNode ($ this ->dom , $ data , $ this -> getRealRootNodeName () );
58+ $ this ->appendNode ($ this ->dom , $ data , $ xmlRootNodeName );
4759 }
4860
4961 return $ this ->dom ->saveXML ();
@@ -52,7 +64,7 @@ public function encode($data, $format)
5264 /**
5365 * {@inheritdoc}
5466 */
55- public function decode ($ data , $ format )
67+ public function decode ($ data , $ format, array $ context = array () )
5668 {
5769 $ internalErrors = libxml_use_internal_errors (true );
5870 $ disableEntities = libxml_disable_entity_loader (true );
@@ -269,12 +281,13 @@ private function parseXml($node)
269281 *
270282 * @param DOMNode $parentNode
271283 * @param array|object $data data
284+ * @param string $xmlRootNodeName
272285 *
273286 * @return Boolean
274287 *
275288 * @throws UnexpectedValueException
276289 */
277- private function buildXml ($ parentNode , $ data )
290+ private function buildXml ($ parentNode , $ data, $ xmlRootNodeName )
278291 {
279292 $ append = true ;
280293
@@ -310,21 +323,24 @@ private function buildXml($parentNode, $data)
310323
311324 return $ append ;
312325 }
326+
313327 if (is_object ($ data )) {
314328 $ data = $ this ->serializer ->normalize ($ data , $ this ->format );
315329 if (null !== $ data && !is_scalar ($ data )) {
316- return $ this ->buildXml ($ parentNode , $ data );
330+ return $ this ->buildXml ($ parentNode , $ data, $ xmlRootNodeName );
317331 }
332+
318333 // top level data object was normalized into a scalar
319334 if (!$ parentNode ->parentNode ->parentNode ) {
320335 $ root = $ parentNode ->parentNode ;
321336 $ root ->removeChild ($ parentNode );
322337
323- return $ this ->appendNode ($ root , $ data , $ this -> getRealRootNodeName () );
338+ return $ this ->appendNode ($ root , $ data , $ xmlRootNodeName );
324339 }
325340
326341 return $ this ->appendNode ($ parentNode , $ data , 'data ' );
327342 }
343+
328344 throw new UnexpectedValueException ('An unexpected value could not be serialized: ' .var_export ($ data , true ));
329345 }
330346
@@ -376,7 +392,7 @@ private function needsCdataWrapping($val)
376392 private function selectNodeType ($ node , $ val )
377393 {
378394 if (is_array ($ val )) {
379- return $ this ->buildXml ($ node , $ val );
395+ return $ this ->buildXml ($ node , $ val, null );
380396 } elseif ($ val instanceof \SimpleXMLElement) {
381397 $ child = $ this ->dom ->importNode (dom_import_simplexml ($ val ), true );
382398 $ node ->appendChild ($ child );
@@ -403,14 +419,8 @@ private function selectNodeType($node, $val)
403419 /**
404420 * Get real XML root node name, taking serializer options into account.
405421 */
406- private function getRealRootNodeName ( )
422+ private function resolveXmlRootName ( array $ context = array () )
407423 {
408- if (!$ this ->serializer ) {
409- return $ this ->rootNodeName ;
410- }
411-
412- $ context = $ this ->serializer ->getContext ();
413-
414424 return isset ($ context ['xml_root_node_name ' ])
415425 ? $ context ['xml_root_node_name ' ]
416426 : $ this ->rootNodeName ;
0 commit comments