本文共 3548 字,大约阅读时间需要 11 分钟。
以下是一个XML示范文件的示例,展示了如何结构化和存储数据:
以下是与数据结构相关的定义:
struct stuNodeData{ CString strGuid; CString strClassName; CString strDisplayName; CString strBlockName; stuNodeData() { strGuid = _T ""; strClassName = _T ""; strDisplayName = _T ""; strBlockName = _T ""; } stuNodeData(const stuNodeData& src) { strGuid = src.strGuid; strClassName = src.strClassName; strDisplayName = src.strDisplayName; strBlockName = src.strBlockName; } void DoPropExchange(CXTPPropExchange* pPX) { PX_String(pPX, _T("ID"), strGuid); PX_String(pPX, _T("Class"), strClassName); PX_String(pPX, _T("DisplayName"), strDisplayName); PX_String(pPX, _T("BlockName"), strBlockName); } };
以下是读取数据文件的函数实现:
void LoadDatFile(CString dataPath, std::vector& vecNodeData){ CXTPPropExchangeXMLNode px(TRUE, NULL, _T("GalleryLibrary")); if (!px.LoadFromFile(dataPath)) return; if (!px.OnBeforeExchange()) return; px.SetCompactMode(TRUE); CString strPattern = _T("GalleryItems/GalleryItem"); CXTPPropExchangeEnumeratorPtr enumData(px.GetEnumerator(strPattern)); POSITION pos = enumData->GetPosition(); while (pos) { CXTPPropExchangeSection sec(enumData->GetNext(pos)); stuNodeData data; data.DoPropExchange(&sec); vecNodeData.push_back(data); } }
以下是写入数据文件的函数实现:
bool WriteDatFile(CString& strFilePath, std::vector& vecNodeData){ CXTPPropExchangeXMLNode px(FALSE, NULL, _T("GalleryLibrary")); if (!px.OnBeforeExchange()) { return false; } px.SetCompactMode(TRUE); if (vecNodeData.size() <= 0) { return false; } CXTPPropExchangeSection secStandardList(px.GetSection(_T("StandardList"))); CXTPPropExchangeEnumeratorPtr enumData(secStandardList->GetEnumerator(_T("Standard"))); POSITION pos = enumData->GetPosition(); for (int i = 0; i < vecNodeData.GetCount(); i++) { CXTPPropExchangeSection sec(enumData->GetNext(pos)); vecNodeData.at(i)->DoPropExchange(&sec); } px.SaveToFile(strFilePath); return true; }
以下是一个更高层级的扩展示例:
void CustomWellData::DoPropExchange(CXTPPropExchange* pPX){ PX_String(pPX, _T("name"), strStandardNm); PX_String(pPX, _T("material"), strMaterial); if (pPX->IsLoading()) { CXTPPropExchangeEnumeratorPtr enumData(pPX->GetEnumerator(_T("DrainageList/Drainage"))); POSITION pos = enumData->GetPosition(); while (pos) { CXTPPropExchangeSection sec(enumData->GetNext(pos)); CustomDrainageData* pData = new CustomDrainageData(); pData->DoPropExchange(&sec); arrDrainageData.Add(pData); } } else { CXTPPropExchangeSection secList(pPX->GetSection(_T("DrainageList"))); CXTPPropExchangeEnumeratorPtr enumData(pPX->GetEnumerator(_T("Drainage"))); POSITION pos = enumData->GetPosition(); for (int j = 0; j < arrDrainageData.GetSize(); j++) { CXTPPropExchangeSection sec(enumData->GetNext(pos)); arrDrainageData[j]->DoPropExchange(&sec); ((CXTPPropExchangeXMLNode*)&secList)->PutSection((CXTPPropExchangeXMLNode*)&sec); } } }
转载地址:http://udqn.baihongyu.com/