XMLClassesRegistry.cpp
Go to the documentation of this file.
1 /*+-------------------------------------------------------------------------+
2  | MultiVehicle simulator (libmvsim) |
3  | |
4  | Copyright (C) 2014-2024 Jose Luis Blanco Claraco |
5  | Copyright (C) 2017 Borys Tymchenko (Odessa Polytechnic University) |
6  | Distributed under 3-clause BSD License |
7  | See COPYING |
8  +-------------------------------------------------------------------------+ */
9 
10 #include "XMLClassesRegistry.h"
11 
12 #include <mrpt/core/bits_math.h>
13 #include <mrpt/core/format.h>
14 
15 #include <algorithm> // count()
16 
17 using namespace mvsim;
18 using namespace std;
19 
20 const rapidxml::xml_node<char>* XmlClassesRegistry::get(const std::string& xml_node_class) const
21 {
22  map<string, TXMLData>::const_iterator it = classes_.find(xml_node_class);
23  if (it == classes_.end())
24  return nullptr;
25  else
26  return it->second.xml_doc->first_node();
27 }
28 
29 void XmlClassesRegistry::add(const std::string& input_xml_node_class)
30 {
31  // Parse the string as if it was an XML file:
32  std::string* xml_node_class = new std::string(input_xml_node_class);
33 
34  char* input_str = const_cast<char*>(xml_node_class->c_str());
36  try
37  {
38  xml->parse<0>(input_str);
39 
40  // sanity checks:
41  // e.g. "vehicle:class"
42  const rapidxml::xml_node<>* root_node = xml->first_node(tagname_.c_str());
43  if (!root_node)
44  throw runtime_error(
45  mrpt::format("[XmlClassesRegistry] Missing XML node <%s>", tagname_.c_str()));
46 
47  const rapidxml::xml_attribute<>* att_name = root_node->first_attribute("name");
48  if (!att_name || !att_name->value())
49  throw runtime_error(mrpt::format(
50  "[XmlClassesRegistry] Missing mandatory attribute "
51  "'name' in node <%s>",
52  tagname_.c_str()));
53 
54  const string sClassName = att_name->value();
55 
56  // All OK:
57  TXMLData& d = classes_[sClassName];
58  d.xml_doc = xml;
59  d.xml_data = xml_node_class;
60  }
61  catch (const rapidxml::parse_error& e)
62  {
63  unsigned int line = static_cast<long>(std::count(input_str, e.where<char>(), '\n') + 1);
64  delete xml;
65  throw std::runtime_error(mrpt::format(
66  "[XmlClassesRegistry] XML parse error (Line %u): %s", static_cast<unsigned>(line),
67  e.what()));
68  }
69  catch (const std::exception&)
70  {
71  delete xml;
72  throw;
73  }
74 }
XMLClassesRegistry.h
mvsim
Definition: Client.h:21
rapidxml::xml_attribute
Definition: rapidxml.hpp:138
mvsim::XmlClassesRegistry::get
const rapidxml::xml_node< char > * get(const std::string &xml_node_class) const
Definition: XMLClassesRegistry.cpp:20
rapidxml::xml_node::first_node
xml_node< Ch > * first_node(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const
Definition: rapidxml.hpp:936
d
d
rapidxml::parse_error::where
Ch * where() const
Definition: rapidxml.hpp:94
rapidxml::xml_document
Definition: rapidxml.hpp:139
rapidxml::xml_node< char >
std
mvsim::XmlClassesRegistry::add
void add(const std::string &input_xml_node_class)
Definition: XMLClassesRegistry.cpp:29
rapidxml::parse_error::what
virtual const char * what() const
Definition: rapidxml.hpp:85
rapidxml::xml_node::first_attribute
xml_attribute< Ch > * first_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const
Definition: rapidxml.hpp:1025
rapidxml::parse_error
Definition: rapidxml.hpp:71
mvsim::XmlClassesRegistry::TXMLData
Definition: XMLClassesRegistry.h:23
rapidxml::xml_document::parse
void parse(Ch *text)
Definition: rapidxml.hpp:1381


mvsim
Author(s):
autogenerated on Wed May 28 2025 02:13:08