///////////////////////////////////////////////////////////////////// // DemoXml.cpp - Demo how to use XmlDocument to perist Widgets // // // // Jim Fawcett, CSE687 - Object Oriented Design, Spring 2017 // ///////////////////////////////////////////////////////////////////// #include "DemoXml.h" #include "../Convert/Convert.h" #include "../XmlDocument/XmlDocument/XmlDocument.h" #include "../XmlDocument/XmlElement/XmlElement.h" #include "StrHelper.h" using namespace XmlProcessing; using SPtr = std::shared_ptr; //----< persist Widget object to XML string >------------------------ std::string widgetToXml(const Widget& widget) { XmlDocument doc; SPtr pRoot = makeTaggedElement("widget"); doc.docElement() = pRoot; // make Property name element and add to root SPtr pNameElem = makeTaggedElement("name"); pRoot->addChild(pNameElem); SPtr pTextNode = makeTextElement(widget.name); pNameElem->addChild(pTextNode); // make Property pi element and add to root SPtr pPiElem = makeTaggedElement("pi"); pRoot->addChild(pPiElem); std::string body = Convert::toString(widget.pi); pTextNode = makeTextElement(body); pPiElem->addChild(pTextNode); return doc.toString(); } //----< deserialize Widget object from XML string >------------------ /* * - XML returned from doc.toString() is indented. * We need to trim text node values to remove indenting chars, * e.g., newlines and spaces. * - That functionality is provided in StrHelper.h * */ Widget widgetFromXml(const std::string& xml) { Widget widget; XmlDocument doc(xml, XmlDocument::str); std::vector desc = doc.descendents("name").select(); std::string name_value = desc[0]->children()[0]->value(); widget.name = trim(name_value); desc = doc.descendents("pi").select(); std::string pi_value = desc[0]->children()[0]->value(); pi_value = trim(pi_value); widget.pi = Convert::fromString(pi_value); return widget; } int main() { Widget widget; widget.name = "jim"; std::string xml = widgetToXml(widget); std::cout << "\n Widget Xml:" << xml; std::cout << "\n"; std::cout << "\n new Widget instantiated from XML"; Widget newWidget = widgetFromXml(xml); std::cout << "\n widget.name = " << newWidget.name; std::cout << "\n widget.pi = " << newWidget.pi; std::cout << "\n\n"; }