@@ -59,6 +59,7 @@ class XmlEncoder implements EncoderInterface, DecoderInterface, NormalizationAwa
59
59
public const TYPE_CAST_ATTRIBUTES = 'xml_type_cast_attributes ' ;
60
60
public const VERSION = 'xml_version ' ;
61
61
public const CDATA_WRAPPING = 'cdata_wrapping ' ;
62
+ public const CDATA_WRAPPING_NAME_PATTERN = 'cdata_wrapping_name_pattern ' ;
62
63
public const CDATA_WRAPPING_PATTERN = 'cdata_wrapping_pattern ' ;
63
64
public const IGNORE_EMPTY_ATTRIBUTES = 'ignore_empty_attributes ' ;
64
65
@@ -440,10 +441,15 @@ private function appendNode(\DOMNode $parentNode, mixed $data, string $format, a
440
441
441
442
/**
442
443
* Checks if a value contains any characters which would require CDATA wrapping.
444
+ *
445
+ * @param array<mixed, mixed> $context
443
446
*/
444
- private function needsCdataWrapping (string $ val , array $ context ): bool
447
+ private function needsCdataWrapping (string $ name , string $ val , array $ context ): bool
445
448
{
446
- return ($ context [self ::CDATA_WRAPPING ] ?? $ this ->defaultContext [self ::CDATA_WRAPPING ]) && preg_match ($ context [self ::CDATA_WRAPPING_PATTERN ] ?? $ this ->defaultContext [self ::CDATA_WRAPPING_PATTERN ], $ val );
449
+ return ($ context [self ::CDATA_WRAPPING ] ?? $ this ->defaultContext [self ::CDATA_WRAPPING ]) &&
450
+ (preg_match ($ context [self ::CDATA_WRAPPING_PATTERN ] ?? $ this ->defaultContext [self ::CDATA_WRAPPING_PATTERN ], $ val ) ||
451
+ (($ context [self ::CDATA_WRAPPING_NAME_PATTERN ] ?? $ this ->defaultContext [self ::CDATA_WRAPPING_NAME_PATTERN ]) && preg_match ($ context [self ::CDATA_WRAPPING_NAME_PATTERN ] ?? $ this ->defaultContext [self ::CDATA_WRAPPING_NAME_PATTERN ], $ name ))
452
+ );
447
453
}
448
454
449
455
/**
@@ -471,7 +477,7 @@ private function selectNodeType(\DOMNode $node, mixed $val, string $format, arra
471
477
return $ this ->selectNodeType ($ node , $ this ->serializer ->normalize ($ val , $ format , $ context ), $ format , $ context );
472
478
} elseif (is_numeric ($ val )) {
473
479
return $ this ->appendText ($ node , (string ) $ val );
474
- } elseif (\is_string ($ val ) && $ this ->needsCdataWrapping ($ val , $ context )) {
480
+ } elseif (\is_string ($ val ) && $ this ->needsCdataWrapping ($ node -> nodeName , $ val , $ context )) {
475
481
return $ this ->appendCData ($ node , $ val );
476
482
} elseif (\is_string ($ val )) {
477
483
return $ this ->appendText ($ node , $ val );
0 commit comments