8000 [Serializer] Add CDATA_WRAPPING_NAME_PATTERN support to XmlEncoder · symfony/symfony@ad5bdb6 · GitHub
[go: up one dir, main page]

Skip to content

Commit ad5bdb6

Browse files
author
Maximilian Ruta
committed
[Serializer] Add CDATA_WRAPPING_NAME_PATTERN support to XmlEncoder
1 parent 01c26aa commit ad5bdb6

File tree

2 files changed

+26
-3
lines changed

2 files changed

+26
-3
lines changed

src/Symfony/Component/Serializer/Encoder/XmlEncoder.php

+9-3
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ class XmlEncoder implements EncoderInterface, DecoderInterface, NormalizationAwa
5959
public const TYPE_CAST_ATTRIBUTES = 'xml_type_cast_attributes';
6060
public const VERSION = 'xml_version';
6161
public const CDATA_WRAPPING = 'cdata_wrapping';
62+
public const CDATA_WRAPPING_NAME_PATTERN = 'cdata_wrapping_name_pattern';
6263
public const CDATA_WRAPPING_PATTERN = 'cdata_wrapping_pattern';
6364
public const IGNORE_EMPTY_ATTRIBUTES = 'ignore_empty_attributes';
6465

@@ -440,10 +441,15 @@ private function appendNode(\DOMNode $parentNode, mixed $data, string $format, a
440441

441442
/**
442443
* Checks if a value contains any characters which would require CDATA wrapping.
444+
*
445+
* @param array<mixed, mixed> $context
443446
*/
444-
private function needsCdataWrapping(string $val, array $context): bool
447+
private function needsCdataWrapping(string $name, string $val, array $context): bool
445448
{
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+
);
447453
}
448454

449455
/**
@@ -471,7 +477,7 @@ private function selectNodeType(\DOMNode $node, mixed $val, string $format, arra
471477
return $this->selectNodeType($node, $this->serializer->normalize($val, $format, $context), $format, $context);
472478
} elseif (is_numeric($val)) {
473479
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)) {
475481
return $this->appendCData($node, $val);
476482
} elseif (\is_string($val)) {
477483
return $this->appendText($node, $val);

src/Symfony/Component/Serializer/Tests/Encoder/XmlEncoderTest.php

+17
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,23 @@ public function testDecodeXMLWithProcessInstruction()
568568
$this->assertEquals(get_object_vars($obj), $this->encoder->decode($source, 'xml'));
569569
}
570570

571+
public function testCDataNamePattern()
572+
{
573+
$expected = <<<'XML'
574+
<?xml version="1.0"?>
575+
<response><person><firstname><![CDATA[Benjamin]]></firstname><lastname><![CDATA[Alexandre]]></lastname><other><![CDATA[data]]></other></person><person><firstname><![CDATA[Damien]]></firstname><lastname><![CDATA[Clay]]></lastname><other><![CDATA[data]]></other></person></response>
576+
577+
XML;
578+
$source = ['person' => [
579+
['firstname' => 'Benjamin', 'lastname' => 'Alexandre', 'other' => 'data'],
580+
['firstname' => 'Damien', 'lastname' => 'Clay', 'other' => 'data'],
581+
]];
582+
583+
$this->assertEquals($expected, $this->encoder->encode($source, 'xml',[
584+
XmlEncoder::CDATA_WRAPPING_NAME_PATTERN => '(firstname|lastname|)'
585+
]));
586+
}
587+
571588
public function testDecodeIgnoreWhiteSpace()
572589
{
573590
$source = <<<'XML'

0 commit comments

Comments
 (0)
0