Tidy up some xml structures.

This commit is contained in:
jmsgrogan 2020-05-09 15:29:45 +01:00
parent 875cdc84ff
commit 8771b721d1
31 changed files with 885 additions and 563 deletions

View file

@ -2,28 +2,28 @@
XmlAttribute::XmlAttribute(const std::string& name)
: mName(name),
mValue()
: mName(name),
mValue()
{
}
std::shared_ptr<XmlAttribute> XmlAttribute::Create(const std::string& name)
XmlAttributeUPtr XmlAttribute::Create(const std::string& name)
{
return std::make_shared<XmlAttribute>(name);
return std::make_unique<XmlAttribute>(name);
}
void XmlAttribute::SetValue(const std::string& value)
{
mValue = value;
mValue = value;
}
std::string XmlAttribute::GetName() const
{
return mName;
return mName;
}
std::string XmlAttribute::GetValue() const
{
return mValue;
return mValue;
}

View file

@ -5,21 +5,22 @@
class XmlAttribute
{
std::string mName;
std::string mValue;
private:
std::string mName;
std::string mValue;
public:
XmlAttribute(const std::string& name);
XmlAttribute(const std::string& name);
static std::shared_ptr<XmlAttribute> Create(const std::string& name);
static std::unique_ptr<XmlAttribute> Create(const std::string& name);
void SetValue(const std::string& value);
void SetValue(const std::string& value);
std::string GetName() const;
std::string GetName() const;
std::string GetValue() const;
std::string GetValue() const;
};
using XmlAttributePtr = std::shared_ptr<XmlAttribute>;
using XmlAttributeUPtr = std::unique_ptr<XmlAttribute>;

View file

@ -1,34 +1,33 @@
#include "XmlDocument.h"
XmlDocument::XmlDocument()
:mProlog(XmlProlog::Create("xml"))
:mProlog(XmlProlog::Create("xml"))
{
}
std::shared_ptr<XmlDocument> XmlDocument::Create()
XmlDocumentUPtr XmlDocument::Create()
{
return std::make_shared<XmlDocument>();
return std::make_unique<XmlDocument>();
}
void XmlDocument::SetProlog(XmlPrologPtr prolog)
void XmlDocument::SetProlog(XmlPrologUPtr prolog)
{
mProlog = prolog;
mProlog = std::move(prolog);
}
XmlPrologPtr XmlDocument::GetProlog() const
XmlProlog* XmlDocument::GetProlog() const
{
return mProlog;
return mProlog.get();
}
void XmlDocument::SetRoot(XmlElementPtr root)
void XmlDocument::SetRoot(XmlElementUPtr root)
{
mRoot = root;
mRoot = std::move(root);
}
XmlElementPtr XmlDocument::GetRoot() const
XmlElement* XmlDocument::GetRoot() const
{
return mRoot;
return mRoot.get();
}

View file

@ -6,21 +6,20 @@
class XmlDocument
{
XmlPrologPtr mProlog;
XmlElementPtr mRoot;
XmlPrologUPtr mProlog;
XmlElementUPtr mRoot;
public:
XmlDocument();
XmlDocument();
static std::shared_ptr<XmlDocument> Create();
void SetProlog(XmlPrologPtr prolog);
XmlPrologPtr GetProlog() const;
void SetRoot(XmlElementPtr root);
XmlElementPtr GetRoot() const;
static std::unique_ptr<XmlDocument> Create();
XmlProlog* GetProlog() const;
XmlElement* GetRoot() const;
void SetProlog(XmlPrologUPtr prolog);
void SetRoot(XmlElementUPtr root);
};
using XmlDocumentPtr = std::shared_ptr<XmlDocument>;
using XmlDocumentUPtr = std::unique_ptr<XmlDocument>;

View file

@ -2,60 +2,69 @@
XmlElement::XmlElement(const std::string& tagName)
: mTagName(tagName),
mChildren()
: mTagName(tagName),
mChildren()
{
}
std::shared_ptr<XmlElement> XmlElement::Create(const std::string& tagName)
XmlElementUPtr XmlElement::Create(const std::string& tagName)
{
return std::make_shared<XmlElement>(tagName);
return std::make_unique<XmlElement>(tagName);
}
void XmlElement::AddChild(std::shared_ptr<XmlElement> child)
void XmlElement::SetTagName(const std::string& tagName)
{
mChildren.push_back(child);
mTagName = tagName;
}
void XmlElement::AddChild(XmlElementUPtr child)
{
mChildren.push_back(std::move(child));
}
void XmlElement::AddAttribute(XmlAttributeUPtr attribute)
{
mAttributes.push_back(std::move(attribute));
}
std::string XmlElement::GetTagName() const
{
return mTagName;
return mTagName;
}
std::string XmlElement::GetText() const
{
return mText;
return mText;
}
void XmlElement::SetText(const std::string& text)
{
mText = text;
mText = text;
}
void XmlElement::AddAttribute(XmlAttributePtr attribute)
XmlAttribute* XmlElement::GetAttribute(const std::string& attributeName) const
{
mAttributes.push_back(attribute);
for(const auto& attribute : mAttributes)
{
if(attribute->GetName() == attributeName)
{
return attribute.get();
}
}
return nullptr;
}
XmlAttributePtr XmlElement::GetAttribute(const std::string& attributeName) const
XmlAttribute* XmlElement::GetAttribute(std::size_t index) const
{
for(const auto& attribute : mAttributes)
{
if(attribute->GetName() == attributeName)
{
return attribute;
}
}
return nullptr;
if(index < mAttributes.size())
{
return mAttributes[index].get();
}
return nullptr;
}
std::size_t XmlElement::GetNumAttributes() const
{
return mAttributes.size();
}
std::vector<XmlAttributePtr> XmlElement::GetAttributes()
{
return mAttributes;
return mAttributes.size();
}

View file

@ -7,26 +7,29 @@
class XmlElement
{
protected:
std::string mTagName;
std::vector<XmlAttributePtr> mAttributes;
std::vector<std::shared_ptr<XmlElement> > mChildren;
std::string mText;
std::string mTagName;
std::vector<XmlAttributeUPtr> mAttributes;
std::vector<std::unique_ptr<XmlElement> > mChildren;
std::string mText;
public:
XmlElement(const std::string& tagName);
virtual ~XmlElement() = default;
XmlElement(const std::string& tagName);
virtual ~XmlElement() = default;
static std::shared_ptr<XmlElement> Create(const std::string& tagName);
static std::unique_ptr<XmlElement> Create(const std::string& tagName);
void AddChild(std::shared_ptr<XmlElement> child);
std::string GetTagName() const;
std::string GetText() const;
void SetText(const std::string& text);
void AddAttribute(XmlAttributeUPtr attribute);
void AddChild(std::unique_ptr<XmlElement> child);
void AddAttribute(XmlAttributePtr attribute);
XmlAttributePtr GetAttribute(const std::string& attribute) const;
std::size_t GetNumAttributes() const;
std::vector<XmlAttributePtr> GetAttributes();
std::string GetTagName() const;
std::string GetText() const;
XmlAttribute* GetAttribute(const std::string& attribute) const;
XmlAttribute* GetAttribute(std::size_t index) const;
std::size_t GetNumAttributes() const;
void SetText(const std::string& text);
void SetTagName(const std::string& tagName);
};
using XmlElementPtr = std::shared_ptr<XmlElement>;
using XmlElementUPtr = std::unique_ptr<XmlElement>;

View file

@ -6,375 +6,376 @@ using LS = XmlParser::LineState;
using DS = XmlParser::DocumentState;
XmlParser::XmlParser()
: mDocument(XmlDocument::Create()),
mDocumentState(XmlParser::DocumentState::Await_Prolog),
mLineState(XmlParser::LineState::Await_Tag_Open)
: mDocument(XmlDocument::Create()),
mDocumentState(XmlParser::DocumentState::Await_Prolog),
mLineState(XmlParser::LineState::Await_Tag_Open),
mParentElement(nullptr),
mWorkingElement(nullptr)
{
}
void XmlParser::ProcessLine(const std::string& input)
{
for(std::size_t idx; idx<input.size(); idx++)
{
switch (input[idx])
{
case StringUtils::LEFT_BRACKET:
OnLeftBracket();
break;
case StringUtils::RIGHT_BRACKET:
OnRightBracket();
break;
case StringUtils::QUESTION_MARK:
OnQuestionMark();
break;
case StringUtils::FORWARD_SLASH:
OnForwardSlash();
break;
case StringUtils::EQUALS:
OnEquals();
break;
case StringUtils::DOUBLE_QUOTE:
OnDoubleQuote();
break;
default:
OnChar(input[idx]);
break;
}
}
for(std::size_t idx; idx<input.size(); idx++)
{
switch (input[idx])
{
case StringUtils::LEFT_BRACKET:
OnLeftBracket();
break;
case StringUtils::RIGHT_BRACKET:
OnRightBracket();
break;
case StringUtils::QUESTION_MARK:
OnQuestionMark();
break;
case StringUtils::FORWARD_SLASH:
OnForwardSlash();
break;
case StringUtils::EQUALS:
OnEquals();
break;
case StringUtils::DOUBLE_QUOTE:
OnDoubleQuote();
break;
default:
OnChar(input[idx]);
break;
}
}
}
void XmlParser::OnChar(char c)
{
if(StringUtils::IsAlphaNumeric(c))
{
OnAlphaNumeric(c);
}
else if(StringUtils::IsSpace(c))
{
OnSpace(c);
}
else
{
OnNonAlphaNumeric(c);
}
if(StringUtils::IsAlphaNumeric(c))
{
OnAlphaNumeric(c);
}
else if(StringUtils::IsSpace(c))
{
OnSpace(c);
}
else
{
OnNonAlphaNumeric(c);
}
}
void XmlParser::OnAlphaNumeric(char c)
{
switch(mLineState)
{
case LS::Await_Tag_Open:
OnTextStart(c);
break;
case LS::Await_Tag_Follower:
case LS::Await_Tag_Name:
{
OnTagNameStart(c);
break;
}
case LS::Await_Tag_Name_End:
{
mWorkingTagName.push_back(c);
break;
}
case LS::Await_Attribute_Name:
{
OnAttributeNameStart(c);
break;
}
case LS::Await_Attribute_Name_End:
{
mWorkingAttributeName.push_back(c);
break;
}
case LS::Await_Attribute_Value:
{
break;
}
case LS::Await_Attribute_Value_End:
{
mWorkingAttributeValue.push_back(c);
break;
}
case LS::Await_Text_End:
{
mWorkingText.push_back(c);
break;
}
default:
break;
}
switch(mLineState)
{
case LS::Await_Tag_Open:
OnTextStart(c);
break;
case LS::Await_Tag_Follower:
case LS::Await_Tag_Name:
{
OnTagNameStart(c);
break;
}
case LS::Await_Tag_Name_End:
{
mWorkingTagName.push_back(c);
break;
}
case LS::Await_Attribute_Name:
{
OnAttributeNameStart(c);
break;
}
case LS::Await_Attribute_Name_End:
{
mWorkingAttributeName.push_back(c);
break;
}
case LS::Await_Attribute_Value:
{
break;
}
case LS::Await_Attribute_Value_End:
{
mWorkingAttributeValue.push_back(c);
break;
}
case LS::Await_Text_End:
{
mWorkingText.push_back(c);
break;
}
default:
break;
}
}
void XmlParser::OnNonAlphaNumeric(char c)
{
switch(mLineState)
{
case LS::Await_Tag_Name_End:
{
mWorkingTagName.push_back(c);
break;
}
case LS::Await_Attribute_Name_End:
{
mWorkingAttributeName.push_back(c);
break;
}
case LS::Await_Attribute_Value_End:
{
mWorkingAttributeValue.push_back(c);
break;
}
case LS::Await_Text_End:
{
mWorkingText.push_back(c);
break;
}
default:
break;
}
switch(mLineState)
{
case LS::Await_Tag_Name_End:
{
mWorkingTagName.push_back(c);
break;
}
case LS::Await_Attribute_Name_End:
{
mWorkingAttributeName.push_back(c);
break;
}
case LS::Await_Attribute_Value_End:
{
mWorkingAttributeValue.push_back(c);
break;
}
case LS::Await_Text_End:
{
mWorkingText.push_back(c);
break;
}
default:
break;
}
}
void XmlParser::OnSpace(char c)
{
switch(mLineState)
{
case LS::Await_Tag_Name_End:
OnTagNameEnd();
break;
case LS::Await_Attribute_Name_End:
OnAttributeNameEnd();
break;
case LS::Await_Text_End:
mWorkingText.push_back(c);
break;
case LS::Await_Attribute_Value_End:
mWorkingAttributeValue.push_back(c);
break;
default:
break;
}
switch(mLineState)
{
case LS::Await_Tag_Name_End:
OnTagNameEnd();
break;
case LS::Await_Attribute_Name_End:
OnAttributeNameEnd();
break;
case LS::Await_Text_End:
mWorkingText.push_back(c);
break;
case LS::Await_Attribute_Value_End:
mWorkingAttributeValue.push_back(c);
break;
default:
break;
}
}
void XmlParser::OnLeftBracket()
{
switch(mLineState)
{
case LS::Await_Tag_Open:
{
OnTagOpen();
break;
}
case LS::Await_Text_End:
{
OnTextEnd();
OnTagOpen();
break;
}
default:
OnNonAlphaNumeric(StringUtils::LEFT_BRACKET);
break;
}
switch(mLineState)
{
case LS::Await_Tag_Open:
{
OnTagOpen();
break;
}
case LS::Await_Text_End:
{
OnTextEnd();
OnTagOpen();
break;
}
default:
OnNonAlphaNumeric(StringUtils::LEFT_BRACKET);
break;
}
}
void XmlParser::OnRightBracket()
{
switch(mLineState)
{
case LS::Await_Tag_Name_End:
case LS::Await_Attribute_Name:
case LS::Await_Attribute_Name_End:
case LS::Await_Attribute_Value:
{
OnTagClose();
break;
}
default:
OnNonAlphaNumeric(StringUtils::RIGHT_BRACKET);
break;
}
switch(mLineState)
{
case LS::Await_Tag_Name_End:
case LS::Await_Attribute_Name:
case LS::Await_Attribute_Name_End:
case LS::Await_Attribute_Value:
{
OnTagClose();
break;
}
default:
OnNonAlphaNumeric(StringUtils::RIGHT_BRACKET);
break;
}
}
void XmlParser::OnQuestionMark()
{
if(mLineState == LS::Await_Tag_Follower)
{
if(mDocumentState == DS::Await_Prolog)
{
OnStartProlog();
}
}
else if(mDocumentState != DS::Build_Prolog)
{
OnNonAlphaNumeric(StringUtils::QUESTION_MARK);
}
if(mLineState == LS::Await_Tag_Follower)
{
if(mDocumentState == DS::Await_Prolog)
{
OnStartProlog();
}
}
else if(mDocumentState != DS::Build_Prolog)
{
OnNonAlphaNumeric(StringUtils::QUESTION_MARK);
}
}
void XmlParser::OnForwardSlash()
{
if(mLineState == LS::Await_Tag_Follower)
{
if(mDocumentState == DS::Await_Element || mDocumentState == DS::Build_Element)
{
mDocumentState = DS::Close_Element;
}
}
if(mLineState == LS::Await_Tag_Follower)
{
if(mDocumentState == DS::Await_Element || mDocumentState == DS::Build_Element)
{
mDocumentState = DS::Close_Element;
}
}
}
void XmlParser::OnEquals()
{
if(mLineState == LS::Await_Attribute_Name_End)
{
OnAttributeNameEnd();
}
else
{
OnNonAlphaNumeric(StringUtils::EQUALS);
}
if(mLineState == LS::Await_Attribute_Name_End)
{
OnAttributeNameEnd();
}
else
{
OnNonAlphaNumeric(StringUtils::EQUALS);
}
}
void XmlParser::OnDoubleQuote()
{
if(mLineState == LS::Await_Attribute_Value)
{
OnAttributeValueStart();
}
else if(mLineState == LS::Await_Attribute_Value_End)
{
OnAttributeValueEnd();
}
if(mLineState == LS::Await_Attribute_Value)
{
OnAttributeValueStart();
}
else if(mLineState == LS::Await_Attribute_Value_End)
{
OnAttributeValueEnd();
}
}
void XmlParser::OnTagOpen()
{
mLineState = LS::Await_Tag_Follower;
mLineState = LS::Await_Tag_Follower;
}
void XmlParser::OnTagClose()
{
if(mDocumentState == DS::Build_Prolog)
{
onFinishProlog();
}
else if(mDocumentState == DS::Build_Element)
{
if(mLineState == LS::Await_Tag_Name_End)
{
OnTagNameEnd();
}
onElementTagEnd();
}
else if(mDocumentState == DS::Close_Element)
{
if(mWorkingElement->GetTagName() == mWorkingTagName)
{
mDocumentState = DS::Await_Element;
mLineState = LS::Await_Tag_Open;
if(mParentElement)
{
mWorkingElement = mParentElement;
}
}
}
if(mDocumentState == DS::Build_Prolog)
{
onFinishProlog();
}
else if(mDocumentState == DS::Build_Element)
{
if(mLineState == LS::Await_Tag_Name_End)
{
OnTagNameEnd();
}
onElementTagEnd();
}
else if(mDocumentState == DS::Close_Element)
{
if(mWorkingElement->GetTagName() == mWorkingTagName)
{
mDocumentState = DS::Await_Element;
mLineState = LS::Await_Tag_Open;
if(mParentElement)
{
mWorkingElement = mParentElement;
}
}
}
}
void XmlParser::OnTextStart(char c)
{
mWorkingText = c;
mLineState = LS::Await_Text_End;
mWorkingText = c;
mLineState = LS::Await_Text_End;
}
void XmlParser::OnTextEnd()
{
mWorkingElement->SetText(mWorkingText);
mWorkingElement->SetText(mWorkingText);
}
void XmlParser::onElementTagEnd()
{
mDocumentState = DS::Await_Element;
mLineState = LS::Await_Tag_Open;
mDocumentState = DS::Await_Element;
mLineState = LS::Await_Tag_Open;
}
void XmlParser::OnTagNameStart(char c)
{
mWorkingTagName = c;
mLineState = LS::Await_Tag_Name_End;
if(mDocumentState != DS::Build_Prolog && mDocumentState != DS::Close_Element)
{
mDocumentState = DS::Build_Element;
}
mWorkingTagName = c;
mLineState = LS::Await_Tag_Name_End;
if(mDocumentState != DS::Build_Prolog && mDocumentState != DS::Close_Element)
{
mDocumentState = DS::Build_Element;
}
}
void XmlParser::OnTagNameEnd()
{
if(mDocumentState == DS::Build_Prolog)
{
mWorkingProlog = XmlProlog::Create(mWorkingTagName);
mLineState = LS::Await_Attribute_Name;
}
else if(mDocumentState == DS::Build_Element)
{
auto new_element = XmlElement::Create(mWorkingTagName);
mParentElement = mWorkingElement;
mWorkingElement = new_element;
if(mDocumentState == DS::Build_Prolog)
{
mDocument->GetProlog()->SetTagName(mWorkingTagName);
mLineState = LS::Await_Attribute_Name;
}
else if(mDocumentState == DS::Build_Element)
{
auto new_element = XmlElement::Create(mWorkingTagName);
if(!mDocument->GetRoot())
{
mDocument->SetRoot(mWorkingElement);
}
mLineState = LS::Await_Attribute_Name;
}
mParentElement = mWorkingElement;
mWorkingElement = new_element.get();
if(!mDocument->GetRoot())
{
mDocument->SetRoot(std::move(new_element));
}
mLineState = LS::Await_Attribute_Name;
}
}
void XmlParser::OnAttributeNameStart(char c)
{
mWorkingAttributeName = c;
mLineState = LS::Await_Attribute_Name_End;
mWorkingAttributeName = c;
mLineState = LS::Await_Attribute_Name_End;
}
void XmlParser::OnAttributeNameEnd()
{
mWorkingAttribute = XmlAttribute::Create(mWorkingAttributeName);
if(mDocumentState == DS::Build_Prolog)
{
mWorkingProlog->AddAttribute(mWorkingAttribute);
}
else if(mDocumentState == DS::Build_Element)
{
mWorkingElement->AddAttribute(mWorkingAttribute);
}
mLineState = LS::Await_Attribute_Value;
auto attribute = XmlAttribute::Create(mWorkingAttributeName);
if(mDocumentState == DS::Build_Prolog)
{
mDocument->GetProlog()->AddAttribute(std::move(attribute));
}
else if(mDocumentState == DS::Build_Element)
{
mWorkingElement->AddAttribute(std::move(attribute));
}
mLineState = LS::Await_Attribute_Value;
}
void XmlParser::OnAttributeValueStart()
{
mWorkingAttributeValue = "";
mLineState = LS::Await_Attribute_Value_End;
mWorkingAttributeValue = "";
mLineState = LS::Await_Attribute_Value_End;
}
void XmlParser::OnAttributeValueEnd()
{
mWorkingAttribute->SetValue(mWorkingAttributeValue);
mLineState = LS::Await_Attribute_Name;
mWorkingElement->GetAttribute(mWorkingAttributeName)->SetValue(mWorkingAttributeValue);
mLineState = LS::Await_Attribute_Name;
}
void XmlParser::OnStartProlog()
{
mDocumentState = DS::Build_Prolog;
mLineState = LS::Await_Tag_Name_End;
mDocumentState = DS::Build_Prolog;
mLineState = LS::Await_Tag_Name_End;
}
void XmlParser::onFinishProlog()
{
mWorkingProlog->Update();
mDocument->SetProlog(mWorkingProlog);
mWorkingProlog = nullptr;
mDocumentState = DS::Await_Element;
mLineState = LS::Await_Tag_Open;
mDocument->GetProlog()->Update();
mDocumentState = DS::Await_Element;
mLineState = LS::Await_Tag_Open;
}
XmlDocumentPtr XmlParser::GetDocument() const
{
return mDocument;
return mDocument;
}

View file

@ -6,97 +6,95 @@
class XmlParser
{
public:
enum class DocumentState
{
Await_Prolog,
Build_Prolog,
Await_Element,
Build_Element,
Close_Element
};
enum class DocumentState
{
Await_Prolog,
Build_Prolog,
Await_Element,
Build_Element,
Close_Element
};
enum class LineState
{
Await_Tag_Open,
Await_Tag_Follower,
Await_Tag_Name,
Await_Tag_Name_End,
Await_Attribute_Name,
Await_Attribute_Name_End,
Await_Attribute_Value,
Await_Attribute_Value_End,
Await_Text_End
};
enum class LineState
{
Await_Tag_Open,
Await_Tag_Follower,
Await_Tag_Name,
Await_Tag_Name_End,
Await_Attribute_Name,
Await_Attribute_Name_End,
Await_Attribute_Value,
Await_Attribute_Value_End,
Await_Text_End
};
private:
DocumentState mDocumentState;
LineState mLineState;
XmlDocumentPtr mDocument;
XmlPrologPtr mWorkingProlog;
XmlElementPtr mParentElement;
XmlElementPtr mWorkingElement;
XmlAttributePtr mWorkingAttribute;
std::string mWorkingAttributeName;
std::string mWorkingTagName;
std::string mWorkingAttributeValue;
std::string mWorkingText;
DocumentState mDocumentState;
LineState mLineState;
XmlDocumentPtr mDocument;
XmlElement* mParentElement;
XmlElement* mWorkingElement;
std::string mWorkingAttributeName;
std::string mWorkingTagName;
std::string mWorkingAttributeValue;
std::string mWorkingText;
public:
XmlParser();
XmlParser();
void ProcessLine(const std::string& input);
void ProcessLine(const std::string& input);
XmlDocumentPtr GetDocument() const;
XmlDocumentPtr GetDocument() const;
private:
void OnLeftBracket();
void OnLeftBracket();
void OnRightBracket();
void OnRightBracket();
void OnQuestionMark();
void OnQuestionMark();
void OnForwardSlash();
void OnForwardSlash();
void OnChar(char c);
void OnChar(char c);
void OnSpace(char c);
void OnSpace(char c);
void OnAlphaNumeric(char c);
void OnAlphaNumeric(char c);
void OnNonAlphaNumeric(char c);
void OnNonAlphaNumeric(char c);
void OnEquals();
void OnEquals();
void OnDoubleQuote();
void OnDoubleQuote();
void OnTagOpen();
void OnTagOpen();
void OnTagNameStart(char c);
void OnTagNameStart(char c);
void OnTagNameEnd();
void OnTagNameEnd();
void OnTagClose();
void OnTagClose();
void OnTextStart(char c);
void OnTextStart(char c);
void OnTextEnd();
void OnTextEnd();
void OnAttributeNameStart(char c);
void OnAttributeNameStart(char c);
void OnAttributeNameEnd();
void OnAttributeNameEnd();
void OnAttributeValueStart();
void OnAttributeValueStart();
void OnAttributeValueEnd();
void OnAttributeValueEnd();
void OnPrologId();
void OnPrologId();
void OnStartProlog();
void OnStartProlog();
void onFinishProlog();
void onFinishProlog();
void onElementTagEnd();
void onElementTagEnd();
};

View file

@ -2,53 +2,53 @@
XmlProlog::XmlProlog(const std::string& tagName)
: XmlElement(tagName),
mVersion(XmlProlog::Version::V1_0),
mEncoding(XmlProlog::Encoding::UTF8)
: XmlElement(tagName),
mVersion(XmlProlog::Version::V1_0),
mEncoding(XmlProlog::Encoding::UTF8)
{
}
std::shared_ptr<XmlProlog> XmlProlog::Create(const std::string& tagName)
XmlPrologUPtr XmlProlog::Create(const std::string& tagName)
{
return std::make_shared<XmlProlog>(tagName);
return std::make_unique<XmlProlog>(tagName);
}
XmlProlog::Encoding XmlProlog::GetEncoding() const
{
return mEncoding;
return mEncoding;
}
XmlProlog::Version XmlProlog::GetVersion() const
{
return mVersion;
return mVersion;
}
void XmlProlog::SetEncoding(const std::string& encoding)
{
if(encoding == "UTF-8")
{
mEncoding == XmlProlog::Encoding::UTF8;
}
if(encoding == "UTF-8")
{
mEncoding == XmlProlog::Encoding::UTF8;
}
}
void XmlProlog::SetVersion(const std::string& version)
{
if(version == "1.0")
{
mVersion == XmlProlog::Version::V1_0;
}
if(version == "1.0")
{
mVersion == XmlProlog::Version::V1_0;
}
}
void XmlProlog::Update()
{
if(const auto version = GetAttribute("version"))
{
SetVersion(version->GetValue());
}
if(const auto version = GetAttribute("version"))
{
SetVersion(version->GetValue());
}
if(const auto encoding = GetAttribute("encoding"))
{
SetEncoding(encoding->GetValue());
}
if(const auto encoding = GetAttribute("encoding"))
{
SetEncoding(encoding->GetValue());
}
}

View file

@ -7,30 +7,31 @@ class XmlProlog : public XmlElement
{
public:
enum class Version{
V1_0
};
enum class Version{
V1_0
};
enum class Encoding{
UTF8
};
enum class Encoding{
UTF8
};
private:
Version mVersion;
Encoding mEncoding;
std::string mTagName;
Version mVersion;
Encoding mEncoding;
public:
XmlProlog(const std::string& tagName);
XmlProlog(const std::string& tagName);
static std::shared_ptr<XmlProlog> Create(const std::string& tagName);
void Update();
Encoding GetEncoding() const;
Version GetVersion() const;
static std::unique_ptr<XmlProlog> Create(const std::string& tagName);
void SetEncoding(const std::string& encoding);
void SetVersion(const std::string& version);
Encoding GetEncoding() const;
Version GetVersion() const;
void SetEncoding(const std::string& encoding);
void SetVersion(const std::string& version);
void Update();
};
using XmlPrologPtr = std::shared_ptr<XmlProlog>;
using XmlPrologUPtr = std::unique_ptr<XmlProlog>;