Skip to content

Commit 520db8a

Browse files
authored
Merge pull request #98 from gsteel/fix-unescaped-entities-in-xml-renderer
Ensure entities are correctly escaped in `XMLRenderer`
2 parents b1a0d32 + 9f2975d commit 520db8a

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

src/Renderer/XmlRenderer.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,12 @@ private function createResourceElement(DOMDocument $doc, string $name, $data)
126126
}
127127

128128
if (is_scalar($data)) {
129-
$data = $this->normalizeConstantValue($data);
130-
return $doc->createElement($name, (string) $data);
129+
$data = $this->normalizeConstantValue($data);
130+
$element = $doc->createElement($name);
131+
$textNode = $doc->createTextNode((string) $data);
132+
$element->appendChild($textNode);
133+
134+
return $element;
131135
}
132136

133137
if (is_object($data)) {

test/Renderer/XmlRendererTest.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,4 +104,19 @@ public function testRendersNullValuesAsTagsWithNoContent(): void
104104
$xml = $renderer->render($resource);
105105
$this->assertStringContainsString('<key/>', $xml);
106106
}
107+
108+
public function testRendersStringsWithAmpersandsAsTagWithEscapedText(): void
109+
{
110+
$resource = new HalResource([
111+
'some-text-tag' => 'https://some-domain.com/some-path?rb=0&mode=widget&appView=1',
112+
]);
113+
$resource = $resource->withLink(new Link('self', '/example'));
114+
115+
$renderer = new XmlRenderer();
116+
$xml = $renderer->render($resource);
117+
$this->assertStringContainsString(
118+
'<some-text-tag>https://some-domain.com/some-path?rb=0&amp;mode=widget&amp;appView=1</some-text-tag>',
119+
$xml
120+
);
121+
}
107122
}

0 commit comments

Comments
 (0)