映射的C结构以XML元素(Mapping C structure to an XML element

2019-10-21 05:55发布

假设我有在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 ++与宏/模板弄虚作假?

奖励积分处理嵌套结构/联合。

Answer 1:

你想要的技术被称为序列化。 您可能需要阅读这些文章:

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



Answer 2:

提示和技巧始终存在。 看看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和铿锵。



文章来源: Mapping C structure to an XML element