From e8ee319175a0a8b3826ba054793f5df7dcadce08 Mon Sep 17 00:00:00 2001 From: dev0 Date: Thu, 18 Dec 2025 15:44:29 +0530 Subject: [PATCH] [FEAT]: [XML]: Escaping --- Src/IACore/imp/cpp/XML.cpp | 41 +++++++++++++++++++++++++++++++---- Src/IACore/inc/IACore/XML.hpp | 6 +++-- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/Src/IACore/imp/cpp/XML.cpp b/Src/IACore/imp/cpp/XML.cpp index 6f16c26..d69ee2e 100644 --- a/Src/IACore/imp/cpp/XML.cpp +++ b/Src/IACore/imp/cpp/XML.cpp @@ -35,17 +35,50 @@ namespace IACore return IA_MOVE(doc); } - String XML::SerializeToString(IN CONST Node &node) + String XML::SerializeToString(IN CONST Node &node, IN BOOL escape) { std::ostringstream oss; node.print(oss); - return oss.str(); + return escape ? EscapeXMLString(oss.str()) : oss.str(); } - String XML::SerializeToString(IN CONST Document &doc) + String XML::SerializeToString(IN CONST Document &doc, IN BOOL escape) { std::ostringstream oss; doc.save(oss); - return oss.str(); + return escape ? EscapeXMLString(oss.str()) : oss.str(); + } + + String XML::EscapeXMLString(IN CONST String &xml) + { + String buffer; + buffer.reserve(xml.size() + (xml.size() / 10)); + + for (char c : xml) + { + switch (c) + { + case '&': + buffer.append("&"); + break; + case '\"': + buffer.append("""); + break; + case '\'': + buffer.append("'"); + break; + case '<': + buffer.append("<"); + break; + case '>': + buffer.append(">"); + break; + default: + buffer.push_back(c); + break; + } + } + + return buffer; } } // namespace IACore \ No newline at end of file diff --git a/Src/IACore/inc/IACore/XML.hpp b/Src/IACore/inc/IACore/XML.hpp index bff6c05..1ba92a7 100644 --- a/Src/IACore/inc/IACore/XML.hpp +++ b/Src/IACore/inc/IACore/XML.hpp @@ -31,7 +31,9 @@ namespace IACore STATIC Expected ParseFromString(IN CONST String &data); STATIC Expected ParseFromFile(IN CONST FilePath &path); - STATIC String SerializeToString(IN CONST Node &node); - STATIC String SerializeToString(IN CONST Document &doc); + STATIC String SerializeToString(IN CONST Node &node, IN BOOL escape = false); + STATIC String SerializeToString(IN CONST Document &doc, IN BOOL escape = false); + + STATIC String EscapeXMLString(IN CONST String &xml); }; } // namespace IACore \ No newline at end of file