这里使用 Pugi XML。我真的希望这会更加用户友好。
注意我已经在这里添加了一个非巨魔答案,因为我找到了使用 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);
}
没有现场演示,因为 Coliru 没有 PugiXML。它打印:
<ORDER>
<ITEM>
<SN>132487A-J</SN>
<NAME>crank casing</NAME>
<Person age="12" passed="Yes">Alive</Person>
<QTY />
</ITEM>
</ORDER>