From fc8065e5505654906e59d744ba636753d79e0210 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sat, 22 Aug 2026 16:17:59 +0300 Subject: [PATCH] fix xml escapes in attribute values --- src/coders/xml.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/coders/xml.cpp b/src/coders/xml.cpp index a907b49db..f4f9799ed 100644 --- a/src/coders/xml.cpp +++ b/src/coders/xml.cpp @@ -208,6 +208,14 @@ namespace { class Parser : BasicParser { std::unique_ptr document; + void processEscapes(std::string& text) { + util::replaceAll(text, """, "\""); + util::replaceAll(text, "'", "'"); + util::replaceAll(text, "<", "<"); + util::replaceAll(text, ">", ">"); + util::replaceAll(text, "&", "&"); + } + std::unique_ptr parseOpenTag() { std::string tag = parseXMLName(); auto node = std::make_unique(tag); @@ -230,6 +238,7 @@ class Parser : BasicParser { } skip(1); attrtext = parseString(quote); + processEscapes(attrtext); } node->set(attrname, attrtext); } @@ -241,11 +250,7 @@ class Parser : BasicParser { if (peek() != '<') { auto element = std::make_unique("#"); auto text = parseText(); - util::replaceAll(text, """, "\""); - util::replaceAll(text, "'", "'"); - util::replaceAll(text, "<", "<"); - util::replaceAll(text, ">", ">"); - util::replaceAll(text, "&", "&"); + processEscapes(text); element->set("#", text); return element; }