5

我有一组 xml 数据文件,这些文件表示图像中感兴趣的对象(矩形、点、标记的面等),我想对其进行解析以生成结构向量。这些文件是手动创建的(因此不仅仅是序列化一些 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 和 ay,而在另一个文件中,每个对象可能包含整数 x1、y1、x2、y2 和双 z。

我想解析这样一个文件以生成一个对象向量,其中 Object 是一个结构,在本例中为 struct Object { int x; 整数y; }。

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

我想编写一个模板化函数,以便您可以仅以某种方式指定结构的元素并让函数返回适当结构的向量。即用户应该指定一个对(“x1”,int),(“x2”,int)等的列表,并让其余的工作自动完成。

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

4

2 回答 2

5

您可以尝试Boost Property Tree

它允许您编写自己的加载/保存函数来将 XML(或 INI 或 JSON)数据映射到您自己的结构上。请参阅教程

它甚至使用您已经在使用的 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输入数据的某些来源在哪里,例如 a boost::ptree,您可以像这样使用该函数:

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

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

于 2013-01-10T15:52:28.423 回答
0

如果您可以为您的 XML 文件编写 XML 模式,那么有一些工具可以从该模式生成 C++-API。关键字是“C++ XML 模式绑定”。

我使用过XSD 编译器,但还有其他类似的工具......

于 2021-07-05T17:40:52.957 回答