Отображение структуры C в элемент XML - PullRequest
1 голос
/ 21 апреля 2010

Предположим, у меня есть структура на 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 ++ любым скучным способом с помощью трюков макросов / шаблонов?

Бонусные баллы за обработку вложенных структур / союзов.

Ответы [ 2 ]

3 голосов
/ 21 апреля 2010

Техника, которую вы хотите, называется сериализацией.Вы можете читать эти статьи:

http://www.codeproject.com/KB/cpp/xmlserialization.aspx

http://www.codesynthesis.com/products/xsd/ <=== Очень близко к тому, что вы хотите! </p>

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

РЕДАКТИРОВАТЬ:

Существует еще один вариант для вас: Xmlize предоставляется Ultimatepp:

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

2 голосов
/ 11 августа 2015

Советы и хитрости всегда существуют. Взгляните на библиотеку 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 и clang.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...