188 {
189 tinyxml2::XMLDocument doc;
190 if (doc.LoadFile(filename.c_str()) != tinyxml2::XML_SUCCESS) {
191 std::cerr << "Failed to load file: " << filename << std::endl;
192 return {};
193 }
194
195 tinyxml2::XMLElement* paramElement = doc.FirstChildElement("Param");
196 if (!paramElement) {
197 std::cerr << "No 'Param' element found in XML. Exiting.\n";
198 return {};
199 }
200
201 tinyxml2::XMLElement* methodsElement = paramElement->FirstChildElement("Methods");
202 if (!methodsElement) {
203 std::cerr << "No 'Methods' element found in 'Param'. Exiting.\n";
204 return {};
205 }
206
207 std::map<std::string, float> parameterMap;
208
209
210 for (tinyxml2::XMLElement* mapElement = methodsElement->FirstChildElement("Map");
211 mapElement; mapElement = mapElement->NextSiblingElement("Map")) {
212 tinyxml2::XMLElement* dynamicElement = mapElement->FirstChildElement("Dynamic");
213 if (!dynamicElement) {
214 std::cerr << "No 'Dynamic' element found in 'Map'. Skipping.\n";
215 continue;
216 }
217
218 tinyxml2::XMLElement* parameterElement = dynamicElement->FirstChildElement("Parameter");
219 if (parameterElement) {
220
221 for (tinyxml2::XMLElement* childElement = parameterElement->FirstChildElement();
222 childElement; childElement = childElement->NextSiblingElement()) {
223 std::string tagName = childElement->Value();
224 std::string tagValue = childElement->GetText() ? childElement->GetText() : "";
225 try {
226 float value = std::stof(tagValue);
227 parameterMap[tagName] =
value;
228 } catch (const std::invalid_argument& e) {
229 std::cerr << "Invalid value for tag " << tagName << ": " << tagValue << std::endl;
230 } catch (const std::out_of_range& e) {
231 std::cerr << "Value out of range for tag " << tagName << ": " << tagValue << std::endl;
232 }
233 }
234 }
235 }
236 return parameterMap;
237 }