假设我有在C或C ++,如的结构:
struct ConfigurableElement {
int ID;
char* strName;
long prop1;
long prop2;
...
};
我想加载/保存到/从以下XML元素:
<ConfigurableElement ID="1" strName="namedElem" prop1="2" prop2="3" ... />
这种映射可以在Java / C#或其他任何语言与该事项运行时反射来完成平凡。 它可以在任何非单调乏味的方式来完成的C ++与宏/模板弄虚作假?
奖励积分处理嵌套结构/联合。
你想要的技术被称为序列化。 您可能需要阅读这些文章:
http://www.codeproject.com/KB/cpp/xmlserialization.aspx
http://www.codesynthesis.com/products/xsd/ <===非常接近你想要的!
http://www.artima.com/cppsource/xml_data_binding.html
http://www.ibm.com/developerworks/xml/library/x-serial.html
http://www.firstobject.com/xml-serialization-in-c++.htm
编辑:
有你另一种选择:由Ultimatepp提供成XML:
http://www.ultimatepp.org/reference$Xmlize.html
http://www.ultimatepp.org/reference$Xmlize$en-us.html
http://www.ultimatepp.org/reference$XmlizeCustomValue$en-us.html
http://www.ultimatepp.org/reference$Xmlize_std$en-us.html
http://www.ultimatepp.org/reference$XML$en-us.html
提示和技巧始终存在。 看看Metaresc库https://github.com/alexanderchuranov/Metaresc
它提供了类型声明,也将产生元数据的接口类型。 基于元数据,你可以很容易地连载/任何复杂的反序列化对象。 输出可以序列盒/反序列化XML,JSON,XDR,Lisp的符号,C-INIT记号。
下面是一个简单的例子:
#include <stdio.h>
#include <stdlib.h>
#include "metaresc.h"
TYPEDEF_STRUCT (host_t,
(char *, host),
int port,
);
TYPEDEF_STRUCT (config_t,
(host_t, local),
(host_t, remote),
(char *, name),
);
int main (int argc, char * argv[])
{
config_t config = {
.local = {
.host = "localhost",
.port = 8080,
},
.remote = {
.host = "google.com",
.port = 80,
},
.name = "service",
};
char * str = MR_SAVE_XML (config_t, &config);
if (str)
{
printf ("%s\n", str);
free (str);
}
return (EXIT_SUCCESS);
}
这一计划将产量
$ ./config
<?xml version="1.0"?>
<config>
<local>
<host>localhost</host>
<port>8080</port>
</local>
<remote>
<host>google.com</host>
<port>80</port>
</remote>
<name>service</name>
</config>
图书馆工作正常最新的gcc和铿锵。