///////////////////////////////////////////////////////////////////////// // XmlUtilities.cpp - Utility class to convert template types to XML // // ver 1.1 // // Jim Fawcett, CSE687 - Object Oriented Design, Spring 2017 // ///////////////////////////////////////////////////////////////////////// #include "XmlUtilities.h" #include "../CppProperties/CppProperties.h" #include using namespace XmlProcessing; class Widget { public: using SPtr = std::shared_ptr; Property name; Property pi; }; template<> typename XmlConvert::SPtr XmlConvert::toXmlElement(const Widget& w, const std::string& tag) { using SPtr = XmlConvert::SPtr; SPtr pElem = makeTaggedElement("widget"); SPtr pName = makeTaggedElement("name"); SPtr pText = makeTextElement(static_cast((w.name))); pName->addChild(pText); SPtr pPi = makeTaggedElement("pi"); pText = makeTextElement(Utilities::Convert::toString(w.pi)); pPi->addChild(pText); pElem->addChild(pName); pElem->addChild(pPi); return pElem; } template<> typename Widget XmlConvert::fromXmlElement(SPtr pElem) { std::vector children = pElem->children(); if (children.size() == 0) throw std::exception("malformed Widget"); SPtr pName = children[0]; SPtr pText = pName->children()[0]; std::string text = pText->value(); Widget temp; temp.name = text; SPtr pPi = children[1]; pText = pPi->children()[0]; text = pText->value(); temp.pi = Utilities::Convert::fromString(text); return temp; } using SPtr = XmlConvert::SPtr; int main() { Utilities::Title("Testing XmlConvert"); SPtr pElem = XmlConvert::toXmlElement("a string body", "str"); std::cout << "\n " << pElem->toString() << "\n"; std::string newStr = XmlConvert::fromXmlElement(pElem); std::cout << "\n value of new string = \"" << newStr << "\""; pElem = XmlConvert::toXmlElement(3.1415927, "dbl"); std::cout << "\n " << pElem->toString() << "\n"; double pi = XmlConvert::fromXmlElement(pElem); std::cout << "\n value of new double = " << pi; Widget widget; widget.name = "aWidget"; widget.pi = 3.1415927; pElem = XmlConvert::toXmlElement(widget, "widget"); std::cout << "\n " << pElem->toString() << "\n"; Widget newWidget = XmlConvert::fromXmlElement(pElem); std::cout << "\n newWidget = { " << newWidget.name << ", " << newWidget.pi << " }"; std::cout << "\n\n"; }