[英]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.