Merge pull request #942 from MihailRis/xml-fixes

fix xml escapes in attribute values
This commit is contained in:
MihailRis 2026-08-22 17:33:21 +03:00 • committed by GitHub
commit e229c1ebb9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -208,6 +208,14 @@ namespace {
class Parser : BasicParser<char> { class Parser : BasicParser<char> {
std::unique_ptr<Document> document; std::unique_ptr<Document> document;
void processEscapes(std::string& text) {
util::replaceAll(text, "&quot;", "\"");
util::replaceAll(text, "&apos;", "'");
util::replaceAll(text, "&lt;", "<");
util::replaceAll(text, "&gt;", ">");
util::replaceAll(text, "&amp;", "&");
}
std::unique_ptr<Node> parseOpenTag() { std::unique_ptr<Node> parseOpenTag() {
std::string tag = parseXMLName(); std::string tag = parseXMLName();
auto node = std::make_unique<Node>(tag); auto node = std::make_unique<Node>(tag);
@ -230,6 +238,7 @@ class Parser : BasicParser<char> {
} }
skip(1); skip(1);
attrtext = parseString(quote); attrtext = parseString(quote);
processEscapes(attrtext);
} }
node->set(attrname, attrtext); node->set(attrname, attrtext);
} }
@ -241,11 +250,7 @@ class Parser : BasicParser<char> {
if (peek() != '<') { if (peek() != '<') {
auto element = std::make_unique<Node>("#"); auto element = std::make_unique<Node>("#");
auto text = parseText(); auto text = parseText();
util::replaceAll(text, "&quot;", "\""); processEscapes(text);
util::replaceAll(text, "&apos;", "'");
util::replaceAll(text, "&lt;", "<");
util::replaceAll(text, "&gt;", ">");
util::replaceAll(text, "&amp;", "&");
element->set("#", text); element->set("#", text);
return element; return element;
} }