Here's using Pugi XML. I was really hoping this would be more user-friendly.
Note I've since added a non-troll answer here, since I found the time to work with TinyXML
#include <pugixml.hpp>
#include <vector>
#include <iostream>
#include <sstream>
struct Person {
int age;
bool passed;
enum Condition { Alive, Dead } condition;
friend std::ostream& operator<<(std::ostream& os, Condition c) {
switch (c) {
case Alive : return os << "Alive";
case Dead : return os << "Dead";
}
throw "failure"; //TODO
}
};
struct Order {
struct Item {
std::string serialnumber, name;
Person person;
int quantity;
};
std::vector<Item> items;
};
using Tree = pugi::xml_node;
Tree make_tree(Person const& p, pugi::xml_node parent) {
auto pt = parent.append_child("Person");
pt.append_attribute("age").set_value(p.age);
pt.append_attribute("passed").set_value(p.passed?"Yes":"No");
std::ostringstream oss;
oss << p.condition;
pt.append_child(pugi::node_pcdata).set_value(oss.str().c_str());
return pt;
}
Tree make_tree(Order::Item const& p, pugi::xml_node parent) {
auto pt = parent.append_child("ITEM");
pt.append_child("SN").append_child(pugi::node_pcdata).set_value(p.serialnumber.c_str());
pt.append_child("NAME").append_child(pugi::node_pcdata).set_value(p.name.c_str());
make_tree(p.person, pt).set_name("Person");
pt.append_child("QTY").set_value(std::to_string(p.quantity).c_str());
return pt;
}
Tree make_tree(Order const& p, pugi::xml_node parent) {
auto pt = parent.append_child("ORDER");
for (auto& item : p.items)
make_tree(item, pt);
return pt;
}
#include <iostream>
/*
* <ORDER>
* <ITEM>
* <SN>132487A-J</SN>
* <NAME>crank casing</NAME>
* <Person age="12" passed="Yes">Alive</Person>
* <QTY>1</QTY>
* </ITEM>
* </ORDER>
*
*/
int main() {
Order const order {
{
Order::Item {
"132487A-J", "crank casing",
Person { 12, true, Person::Alive },
1
},
}
};
pugi::xml_document doc;
make_tree(order, doc.append_child("ORDER"))
.print(std::cout);
}
No Live Demo, since Coliru doesn't have PugiXML. It prints:
<ORDER>
<ITEM>
<SN>132487A-J</SN>
<NAME>crank casing</NAME>
<Person age="12" passed="Yes">Alive</Person>
<QTY />
</ITEM>
</ORDER>