HRESULT ReadValue(LPCWSTR path, LPCWSTR section, LPCWSTR key, std::wstring &strxmlval, LPCWSTR defval) { IXmlReader *pReader = NULL; IStream *pFileStream = NULL; HRESULT hr; XmlNodeType nodeType; LPCWSTR pwszLocalName; LPCWSTR pwszAttributeName; LPCWSTR pwszAttributeValue; int sequence = 0; strxmlval = defval; hr = CreateStreamReader(path, &pReader, &pFileStream); EXIT_NOT_S_OK(hr); while(pReader->Read(&nodeType) == S_OK) { switch(nodeType) { case XmlNodeType_Element: hr = pReader->GetLocalName(&pwszLocalName, NULL); EXIT_NOT_S_OK(hr); switch(sequence) { case 0: if(wcscmp(TagRoot, pwszLocalName) == 0) { sequence = 1; } break; case 1: if(wcscmp(TagSection, pwszLocalName) == 0) { sequence = 2; } break; case 3: if(wcscmp(TagKey, pwszLocalName) == 0) { sequence = 4; } break; default: break; } for(hr = pReader->MoveToFirstAttribute(); hr == S_OK; hr = pReader->MoveToNextAttribute()) { hr = pReader->GetLocalName(&pwszAttributeName, NULL); EXIT_NOT_S_OK(hr); hr = pReader->GetValue(&pwszAttributeValue, NULL); EXIT_NOT_S_OK(hr); switch(sequence) { case 2: if(wcscmp(AttributeName, pwszAttributeName) == 0 && wcscmp(section, pwszAttributeValue) == 0) { sequence = 3; } break; case 4: if(wcscmp(AttributeName, pwszAttributeName) == 0 && wcscmp(key, pwszAttributeValue) == 0) { sequence = 5; } break; case 5: if(wcscmp(AttributeValue, pwszAttributeName) == 0) { strxmlval.assign(pwszAttributeValue); goto exit; } break; default: break; } } break; case XmlNodeType_EndElement: hr = pReader->GetLocalName(&pwszLocalName, NULL); EXIT_NOT_S_OK(hr); switch(sequence) { case 1: if(wcscmp(TagRoot, pwszLocalName) == 0) { goto exit; } break; case 2: if(wcscmp(TagSection, pwszLocalName) == 0) { sequence = 1; } break; case 3: case 4: case 5: if(wcscmp(TagSection, pwszLocalName) == 0) { goto exit; } break; default: break; } break; default: break; } } NOT_S_OK: exit: CloseStreamReader(pReader, pFileStream); return hr; }
HRESULT ReadList(LPCWSTR path, LPCWSTR section, APPDATAXMLLIST &list) { HRESULT hr; IXmlReader *pReader = NULL; IStream *pFileStream = NULL; XmlNodeType nodeType; LPCWSTR pwszLocalName; LPCWSTR pwszAttributeName; LPCWSTR pwszAttributeValue; int sequence = 0; APPDATAXMLATTR attr; APPDATAXMLROW row; hr = CreateStreamReader(path, &pReader, &pFileStream); EXIT_NOT_S_OK(hr); while(pReader->Read(&nodeType) == S_OK) { switch(nodeType) { case XmlNodeType_Element: hr = pReader->GetLocalName(&pwszLocalName, NULL); EXIT_NOT_S_OK(hr); switch(sequence) { case 0: if(wcscmp(TagRoot, pwszLocalName) == 0) { sequence = 1; } break; case 1: if(wcscmp(TagSection, pwszLocalName) == 0) { sequence = 2; } break; case 3: if(wcscmp(TagList, pwszLocalName) == 0) { sequence = 4; } break; case 4: if(wcscmp(TagRow, pwszLocalName) == 0) { sequence = 5; row.clear(); } break; default: break; } for(hr = pReader->MoveToFirstAttribute(); hr == S_OK; hr = pReader->MoveToNextAttribute()) { hr = pReader->GetLocalName(&pwszAttributeName, NULL); EXIT_NOT_S_OK(hr); hr = pReader->GetValue(&pwszAttributeValue, NULL); EXIT_NOT_S_OK(hr); switch(sequence) { case 2: if(wcscmp(TagSection, pwszLocalName) == 0 && wcscmp(AttributeName, pwszAttributeName) == 0 && wcscmp(section, pwszAttributeValue) == 0) { sequence = 3; } break; case 5: if(wcscmp(TagRow, pwszLocalName) == 0) { attr.first = pwszAttributeName; attr.second = pwszAttributeValue; row.push_back(attr); } break; default: break; } } switch(sequence) { case 2: sequence = 1; break; case 5: list.push_back(row); row.clear(); break; default: break; } break; case XmlNodeType_EndElement: hr = pReader->GetLocalName(&pwszLocalName, NULL); EXIT_NOT_S_OK(hr); switch(sequence) { case 1: if(wcscmp(TagRoot, pwszLocalName) == 0) { goto exit; } break; case 2: if(wcscmp(TagSection, pwszLocalName) == 0) { sequence = 1; } break; case 3: if(wcscmp(TagSection, pwszLocalName) == 0) { goto exit; } break; case 4: if(wcscmp(TagSection, pwszLocalName) == 0 || wcscmp(TagList, pwszLocalName) == 0) { goto exit; } break; case 5: if(wcscmp(TagList, pwszLocalName) == 0) { goto exit; } break; default: break; } break; default: break; } } NOT_S_OK: exit: CloseStreamReader(pReader, pFileStream); return hr; }