diff options
author | crupest <crupest@outlook.com> | 2022-02-08 16:53:51 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2022-02-08 16:53:51 +0800 |
commit | 74bb9cd27242b9320f99ff4d2b50c3051576cc14 (patch) | |
tree | 744bac5799c593d1d6f81e7b09581bea626f2cde /include/cru/xml/XmlParser.h | |
parent | b90c398de829d1ba5329651d75bae82f5e4085fe (diff) | |
download | cru-74bb9cd27242b9320f99ff4d2b50c3051576cc14.tar.gz cru-74bb9cd27242b9320f99ff4d2b50c3051576cc14.tar.bz2 cru-74bb9cd27242b9320f99ff4d2b50c3051576cc14.zip |
...
Diffstat (limited to 'include/cru/xml/XmlParser.h')
-rw-r--r-- | include/cru/xml/XmlParser.h | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/include/cru/xml/XmlParser.h b/include/cru/xml/XmlParser.h new file mode 100644 index 00000000..75664ce3 --- /dev/null +++ b/include/cru/xml/XmlParser.h @@ -0,0 +1,47 @@ +#pragma once + +#include "XmlNode.h" + +#include "cru/common/Exception.h" +#include "cru/common/String.h" + +#include <optional> + +namespace cru::xml { +class CRU_XML_API XmlParsingException : public Exception { + public: + using Exception::Exception; +}; + +class CRU_XML_API XmlParser { + public: + explicit XmlParser(String xml); + + CRU_DELETE_COPY(XmlParser) + CRU_DELETE_MOVE(XmlParser) + + ~XmlParser(); + + XmlElementNode* Parse(); + + private: + XmlElementNode* DoParse(); + + char16_t Read1(); + String ReadWithoutAdvance(int count = 1); + void ReadSpacesAndDiscard(); + String ReadSpaces(); + String ReadIdenitifier(); + String ReadAttributeString(); + + private: + String xml_; + + XmlElementNode* cache_ = nullptr; + + // Consider the while file enclosed by a single tag called $root. + XmlElementNode* pseudo_root_node_ = new XmlElementNode(u"$root"); + XmlElementNode* current_ = pseudo_root_node_; + int current_position_ = 0; +}; +} // namespace cru::xml |