aboutsummaryrefslogtreecommitdiff
path: root/include/cru/base/xml/XmlParser.h
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-11-04 21:59:42 +0800
committerYuqian Yang <crupest@crupest.life>2025-11-04 21:59:42 +0800
commit1a6111e3f02b0a9cff0f81fb524b4dfb7d69854b (patch)
tree3a92e1bf61fc165c2148f38ca6602f5066011f06 /include/cru/base/xml/XmlParser.h
parentf48505c96a70e2f1d1982fea30f3015e42fcd49d (diff)
downloadcru-1a6111e3f02b0a9cff0f81fb524b4dfb7d69854b.tar.gz
cru-1a6111e3f02b0a9cff0f81fb524b4dfb7d69854b.tar.bz2
cru-1a6111e3f02b0a9cff0f81fb524b4dfb7d69854b.zip
Move xml to base.
Diffstat (limited to 'include/cru/base/xml/XmlParser.h')
-rw-r--r--include/cru/base/xml/XmlParser.h43
1 files changed, 43 insertions, 0 deletions
diff --git a/include/cru/base/xml/XmlParser.h b/include/cru/base/xml/XmlParser.h
new file mode 100644
index 00000000..22b529d7
--- /dev/null
+++ b/include/cru/base/xml/XmlParser.h
@@ -0,0 +1,43 @@
+#pragma once
+
+#include "../Exception.h"
+#include "XmlNode.h"
+
+namespace cru::xml {
+class CRU_BASE_API XmlParsingException : public Exception {
+ public:
+ using Exception::Exception;
+};
+
+class CRU_BASE_API XmlParser {
+ public:
+ explicit XmlParser(std::string xml);
+
+ CRU_DELETE_COPY(XmlParser)
+ CRU_DELETE_MOVE(XmlParser)
+
+ ~XmlParser();
+
+ XmlElementNode* Parse();
+
+ private:
+ XmlElementNode* DoParse();
+
+ char16_t Read1();
+ std::string ReadWithoutAdvance(int count = 1);
+ void ReadSpacesAndDiscard();
+ std::string ReadSpaces();
+ std::string ReadIdenitifier();
+ std::string ReadAttributeString();
+
+ private:
+ std::string xml_;
+
+ XmlElementNode* cache_ = nullptr;
+
+ // Consider the while file enclosed by a single tag called $root.
+ XmlElementNode* pseudo_root_node_ = new XmlElementNode("$root");
+ XmlElementNode* current_ = pseudo_root_node_;
+ int current_position_ = 0;
+};
+} // namespace cru::xml