c++ - 如何编写通用 C++ 函数将 xml 解析为结构?

标签 c++ xml templates boost

我有一组 xml 数据文件,代表图像中感兴趣的对象(矩形、点、标记的面等),我想解析这些文件以生成结构 vector 。这些文件是手动创建的(因此不仅仅是序列化某些 C++ 对象的结果)并且具有以下形式:

<root>
<image filename=whatever>
<object>
  <x>1</x>
  <y>2</y>
</object>
<object>
  <x>3</x>
  <y>4</y>
</object>
</image>
<image filename=something>
 ...
</image>
</root>

所以图像集合,每个图像都包含对象子对象的集合,每个子对象都有提供与该对象相关的数据的子对象。此数据的结构因文件而异,例如在一个文件中,每个对象可能只有一个 x 和一个 y,而在另一个文件中,每个对象可能包含整数 x1、y1、x2、y2 和一个 double z。

我想解析这样一个文件以生成一个对象 vector ,其中对象是一个结构,在这种情况下是 struct Object { int x;诠释y; }.

对于对象的不同选择,我目前有单独的函数使用 rapidxml 以相同的方式解析 xml,除了它们提取的字段。

我想编写一个模板函数,这样您就可以仅以某种方式指定结构的元素,并让该函数返回适当结构的 vector 。即,用户应指定一个对 ("x1", int)、("x2", int) 等的列表,然后自动完成其余工作。

我确信必须有一个很好的解决方案来解决这个问题,避免必须使用 XML 模式。我该怎么做呢?

最佳答案

你可以试试 Boost Property Tree .

它允许您编写自己的加载/保存函数以将 XML(或 INI 或 JSON)数据映射到您自己的结构中。查看tutorial .

它甚至使用您已经在使用的 RapidXML。

编辑:

你可以尝试类似的东西

template<typename T>
struct Field
{
    typedef T type;
    std::string name;
};

template<typename... Fields>
std::tuple<typename Fields::type...>
load(const Data& data, Fields... f)
{
    return std::make_tuple( data.get<typename Fields::type>(f.name)... );
}

其中 Data 是输入数据的某个来源,例如 boost::ptree,您可以像这样使用该函数:

load(d, Field<int>{"x1"}, Field<int>{"x2"} );

然后您只需要每个数据类型都可以从正确类型的元组构造。

关于c++ - 如何编写通用 C++ 函数将 xml 解析为结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14256686/

相关文章:

c++ - C++ 和字符串 vector 中的内存泄漏或其他问题

命名空间中的 C++ 函数不起作用?

c++ - 有什么方法可以识别流?

c++ - 有没有办法调用被重写的对象的基类方法? (C++)

c++ - extern 模板是否会阻止函数内联?

python - Django 中的模板不存在

c++ - 模板表达式如何摆脱临时变量

JAVA读取XML,直接从element

java - GAE Servlet XML 响应。如何?

xml - Fortran XML 库的推荐