【问题标题】:Mapping C structure to an XML element将 C 结构映射到 XML 元素
【发布时间】:2010-04-21 17:56:11
【问题描述】:

假设我有一个 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++ 中使用宏/模板技巧以任何非繁琐的方式完成吗?

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

【问题讨论】:

    标签: c++ c xml reflection struct


    【解决方案1】:

    【讨论】:

    • 我知道什么是序列化。我对指定格式的 人类可读 序列化感兴趣。但 XSD 可能实际上很有趣。
    • 是的,我预测 XSD 非常接近您想要的。它具有双重许可、GPL 和商业许可。
    【解决方案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 和 clang。

    【讨论】:

    • 我是新手。如何在 Windows 7 下将此库与 code::blocks 一起使用?我尝试添加 .c 和 .h 文件,但是当我包含 metaresc.h 并将其构建到我的项目中时,找不到文件 mr_pp.h。我在哪里可以找到这个文件,我在项目中没有看到它。谢谢
    • mr_pp.h 是自动生成的头文件。您只能使用 autoconf/automake/make 工具链来构建它。更多细节可以在这里找到github.com/alexanderchuranov/Metaresc/blob/master/README你不能只把头文件放到你的项目中。您需要单独构建库并在链接阶段与主项目链接。查看示例/子文件夹。
    猜你喜欢
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2014-03-14
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多