簡體   English   中英

如何編寫通用C ++函數將xml解析為結構?

[英]How do I write a generic C++ function to parse xml into structs?

我有一個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,在另一個文件中,每個對象可能包含int x1,y1,x2,y2和雙精度z。

我想解析這樣的文件以生成對象的向量,其中對象是一個結構,在這種情況下為結構struct Object {int x; 詮釋 }。

對於Object的不同選擇,我目前擁有單獨的函數,這些函數使用rapidxml以相同的方式解析xml,但它們提取的字段不同。

我想編寫一個模板化函數,以便您只能以某種方式指定結構的元素,並使該函數返回適當結構的向量。 即,用戶應指定對(“ x1”,int),(“ x2”,int)等對的列表,並使其余工作自動完成。

我確信必須有一個很好的解決方案來避免使用XML模式。 我該怎么做呢?

您可以嘗試Boost屬性樹

它允許您編寫自己的加載/保存函數,以將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是輸入數據的某種來源,例如boost::ptree ,您將使用以下函數:

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

然后,您只需要從正確類型的元組中構造每種數據類型即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM