Mapping C structure to an XML element

2019-08-06 04:17发布

Suppose I have a structure in C or C++, such as:

struct ConfigurableElement {
   int ID;
   char* strName;
   long prop1;
   long prop2;
   ...
};

I would like to load/save it to/from the following XML element:

 <ConfigurableElement ID="1" strName="namedElem" prop1="2" prop2="3" ... />

Such a mapping can be trivially done in Java/C# or any other language with run-time reflection for the matter. Can it be done in any non-tedious way in C++ with macros/template trickery?

Bonus points for handling nested structures/unions.

2条回答
三岁会撩人
3楼-- · 2019-08-06 05:08

Tips and tricks always exists. Take a look at Metaresc library https://github.com/alexanderchuranov/Metaresc

It provides interface for types declaration that will also generate meta-data for the type. Based on meta-data you can easily serialize/deserialize objects of any complexity. Out of the box you can serialize/deserialize XML, JSON, XDR, Lisp-like notation, C-init notation.

Here is a simple example:

#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);
}

This program will output

$ ./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>

Library works fine for latest gcc and clang.

查看更多
登录 后发表回答