GranOO  3.0
A robust and versatile workbench to build 3D dynamic simulations based on the Discrete Element Method
XmlParser.hpp
Go to the documentation of this file.
1 // This file is part of GranOO, a workbench for DEM simulation.
2 //
3 // Author(s) : - Damien Andre IRCER/UNILIM, Limoges France
4 // <damien.andre@unilim.fr>
5 // - Jean-luc Charles Arts et Metiers ParisTech, CNRS, I2M, Bordeaux France
6 // <jean-luc.charles@ensam.eu>
7 // - Jeremie Girardot Arts et Metiers ParisTech, CNRS, I2M, Bordeaux France
8 // <jeremie.girardot@ensam.eu>
9 // - Cedric Hubert LAMIH/UPHF, Valenciennes France
10 // <cedric.hubert@uphf.fr>
11 // - Ivan Iordanoff Arts et Metiers ParisTech, CNRS, I2M, Bordeaux France
12 // <ivan.iordanoff@ensam.eu>
13 //
14 // Copyright (C) 2008-2019 D. Andre, JL. Charles, J. Girardot, C. Hubert, I. Iordanoff
15 //
16 // This program is free software: you can redistribute it and/or modify
17 // it under the terms of the GNU General Public License as published by
18 // the Free Software Foundation, either version 3 of the License, or
19 // (at your option) any later version.
20 //
21 // This program is distributed in the hope that it will be useful,
22 // but WITHOUT ANY WARRANTY; without even the implied warranty of
23 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 // GNU General Public License for more details.
25 //
26 // You should have received a copy of the GNU General Public License
27 // along with this program. If not, see <http://www.gnu.org/licenses/>.
28 
29 
30 #ifndef _GranOO_LibUtil_XmlParser_H
31 #define _GranOO_LibUtil_XmlParser_H
32 
33 
34 #include <map>
35 #include <vector>
36 #include <algorithm>
37 #include <array>
38 #include <regex>
39 
40 
41 #include <boost/algorithm/string.hpp>
42 #include <boost/lexical_cast.hpp>
43 
44 #include "GranOO3/Core/TinyXml.hpp"
45 #include "GranOO3/Core/Macro.hpp"
46 #include "GranOO3/Core/String.hpp"
47 #include "GranOO3/Core/Out.hpp"
48 
49 
50 // This macro assert a condition while reading an xml file
51 // and print a friendly error message
52 #define XmlAssert(condition, message) \
53  GranOO3::Core::XmlParser::get().raise_assertion(!(condition), __LINE__, __FILE__, #condition, message);
54 
55 namespace GranOO3
56 {
57  namespace Core
58  {
59  template<class T> class SetOf;
60  }
61  namespace Geom
62  {
63  class Vector;
64  class Point;
65  class Quaternion;
66  class Frame;
67  }
68  namespace Math
69  {
70  class Expression;
71  }
72 }
73 
74 
75 
76 
77 namespace GranOO3
78 {
79  namespace Core
80  {
81 
82  template<typename T>
84  {
85  public:
86  static void read_xml_file(const std::string & xPathParent, const std::string & filename = Core::String::empty_string);
87  static T* read_element(const TiXmlElement*, bool ID_required = true);
88  static T* get_item(const std::string &);
89  static T& get(const std::string &);
90  static bool exist(const std::string &);
91  static std::string get_ID (const T*);
92  static void add_item(const std::string &, T *);
93  static std::string class_ID() {return std::string("XmlObjectManager<"+std::string(typeid(T).name())+">");}
94  static void clear();
95  static void erase_item(const T*);
96  static std::vector<std::string> get_ID();
97  static std::string get_list();
98 
99  private:
100  static std::map<const std::string, T *> map_;
101 
102  private:
107  };
108 
109 
110 
111 
112  //
113  // Class XmlParser is a singleton. Is gives methodes
114  // to open, parse and read an XML tree
115  //
116  enum State {GRANOO_REQUIRED=0, GRANOO_OPTIONAL=1, GRANOO_UNIQUE=2};
117 
118  namespace Attribute {enum State {GRANOO_REQUIRED=0, GRANOO_OPTIONAL=1};}
119  namespace Element { enum State {GRANOO_REQUIRED=0, GRANOO_OPTIONAL=1, GRANOO_UNIQUE=2};}
120 
121  class XmlParser
122  {
123  public:
124  static XmlParser& get();
125 
126  // Internal use only, not documented
127  static XmlParser& open(const std::string&);
128  static XmlParser& open_memory(const std::string&, const std::string&);
129 
130  public:
131  // Internal use only, not documented
132  TiXmlDocument& get_xml_doc();
133  const TiXmlDocument& get_xml_doc() const;
134 
135  const TiXmlElement* get_root_element(const std::string&);
136  const TiXmlElement* get_root_element();
137  const TiXmlElement* get_child_element(const Element::State, const TiXmlNode*, const std::string&);
138  const TiXmlElement* get_child_element(const Element::State, const TiXmlNode*);
139 
140 
141  void set_current_element(const TiXmlElement*);
142  const TiXmlElement* get_current_element();
143 
146 
147 
148  bool attribute_exist(const std::string&);
149 
150 
151 
152  template<typename T> // T must be a container
154 
155  template<typename T> // T must be a container
157 
158  void raise_assertion(bool, int, const std::string&, const std::string&, const std::string&);
159 
160  // Only these methods are documented
161  template<typename T> void read_attribute(const Attribute::State, const std::string&, T&);
162  template<typename T> T read_attribute(const Attribute::State, const std::string&);
163  template<typename T> T read_attribute(const std::string&, T); // Optional state with given default value
164 
165  template<typename T> void CheckAllowedAttributeValue(const std::string& name, const T&); // T must be an array
166 
167 
168  template <typename ... T>
169  void AllowedValue(const std::string& name, const T& ...);
170  template<typename T>
171  void AllowedValue(const std::string& name, const T&);
172  template<typename T>
173  void AllowedValue(const std::string& name, const T&, const T&);
174  template<typename T>
175  void AllowedValue(const std::string& name, const T&, const T&, const T&);
176  template<typename T>
177  void AllowedValue(const std::string& name, const T&, const T&, const T&, const T&);
178  template<typename T>
179  void AllowedValue(const std::string& name, const T&, const T&, const T&, const T&, const T&);
180  template<typename T>
181  void AllowedValue(const std::string& name, const T&, const T&, const T&, const T&, const T&, const T&);
182 
183  void check_attribute_in_conflict(const std::string&, const std::string&);
184  std::string ErrorMsg(const std::string) const;
185 
186  private:
187  XmlParser(); // Not implemented
188  XmlParser(const std::string&);
189  XmlParser(const std::string&, const std::string&);
190  virtual ~XmlParser();
191 
192  std::string RawText(const TiXmlNode*, const unsigned int maxLength = 0) const;
193 
194  void check_unread_attribute(const TiXmlElement*);
195  void check_attribute_in_conflict(const TiXmlElement*, const std::string&, const std::string&);
196 
197  const TiXmlElement* get_child_element_required(const TiXmlNode*, const std::string&);
198  const TiXmlElement* get_child_element_optional(const TiXmlNode*, const std::string&);
199  const TiXmlElement* get_child_element_unique (const TiXmlNode*, const std::string&);
200  const TiXmlElement* get_child_element_required(const TiXmlNode*);
201  const TiXmlElement* get_child_element_optional(const TiXmlNode*);
202  const TiXmlElement* get_child_element_unique (const TiXmlNode*);
203 
204  template<typename T> void read_attribute(const Attribute::State, const TiXmlElement*, const std::string&, T&);
205  template<typename T> T read_attribute(const Attribute::State, const TiXmlElement*, const std::string&);
206  template<typename T> T read_attribute(const TiXmlElement*, const std::string&, T); // Optional state with given default value
207 
208 
209  template<typename T> void set_valueFromAttribute(const TiXmlElement*, const std::string&, T&, Attribute::State);
210  template<typename T> void set_valueFromAttribute_Optional(const TiXmlElement*, const std::string&, T&);
211  template<typename T> void set_valueFromAttribute_Required(const TiXmlElement*, const std::string&, T&);
212 
213 
214  template<typename T> T get_AttributeValue(const TiXmlElement*, const std::string&, Attribute::State, T = T());
215  template<typename T> T get_AttributeValue_Optional(const TiXmlElement*, const std::string&, T = T());
216  template<typename T> T get_AttributeValue_Required(const TiXmlElement*, const std::string&);
217 
218  template<typename T> void ConvertStringTo(const TiXmlElement*, const std::string&, T&);
219  template<typename T> void ConvertStringTo(const TiXmlElement*, const std::string&, std::vector<T>&);
220  template<typename T> void ConvertStringTo(const TiXmlElement*, const std::string&, Core::SetOf<T>*&);
221  template<typename T> std::string TypeName();
222 
223 
224  void AddAllowedAttributeName(const TiXmlElement*, const std::string&);
225  const std::vector<std::string>& get_allowedAttributeNamelist(const TiXmlElement*);
226 
227  bool attribute_exist(const TiXmlElement*, const std::string&);
228 
229  std::string ErrorMsg(const TiXmlNode*, const std::string) const;
230 
231  std::string ErrorMsg() const;
232  void raise_assertion(const TiXmlElement*, const int, const std::string&, const std::string&, const std::string&);
233 
234  bool has_been_read(const TiXmlElement*) const;
235  void get_all_document_element_recursive(const TiXmlElement*, std::vector<const TiXmlElement*>&) const;
236  std::vector<const TiXmlElement*> get_all_document_element() const;
237 
238  private:
239  static XmlParser* _me;
240 
241  private:
242  const std::string _doc_name;
243  TiXmlDocument _doc;
244  std::map<const TiXmlElement*, std::vector<std::string> > _allowed_attribute_name;
245  std::vector<const TiXmlElement*> _element_read;
246  const TiXmlElement* _root_element;
247  const TiXmlElement* _current_element;
248  };
249 
250  #ifndef DOXYGEN_SHOULD_SKIP_THIS
251  template<typename T>
252  void
253  XmlParser::read_attribute(const Attribute::State state, const std::string& name, T& val) {
254  read_attribute(state, get_current_element(), name, val);
255  }
256 
257  template<typename T>
258  T
259  XmlParser::read_attribute(const Attribute::State state, const std::string& name) {
260  return read_attribute<T>(state, get_current_element(), name);
261  }
262 
263  template<typename T>
264  T
265  XmlParser::read_attribute(const std::string& name, T defaultVal) {
266  return read_attribute<T>(get_current_element(), name, defaultVal);
267  }
268 
269  template<typename T>
270  void
271  XmlParser::read_attribute(const Attribute::State state, const TiXmlElement* el, const std::string& name, T& val) {
272  AddAllowedAttributeName(el, name);
273  set_valueFromAttribute(el, name, val, state);
274  }
275 
276  template<typename T>
277  T
278  XmlParser::read_attribute(const Attribute::State state, const TiXmlElement* el, const std::string& name) {
279  if constexpr (std::is_same<T, Geom::Vector>::value) {
280  T val = Geom::Vector(0.,0, 0.);
281  AddAllowedAttributeName(el, name);
282  return get_AttributeValue(el, name, state, val);
283  }
284 
285  if constexpr (std::is_same<T, Geom::Point>::value) {
286  T val = Geom::Point(0.,0, 0.);
287  AddAllowedAttributeName(el, name);
288  return get_AttributeValue(el, name, state, val);
289  }
290 
292  T val = Geom::Quaternion(0.,0, 0.,0.);
293  AddAllowedAttributeName(el, name);
294  return get_AttributeValue(el, name, state, val);
295  }
296 
297  T val = T();
298  AddAllowedAttributeName(el, name);
299  return get_AttributeValue(el, name, state, val);
300  }
301 
302  template<typename T>
303  T
304  XmlParser::read_attribute(const TiXmlElement* el, const std::string& name, T defaultVal) {
305  AddAllowedAttributeName(el, name);
306  set_valueFromAttribute_Optional(el, name, defaultVal);
307  return defaultVal;
308  }
309 
310  template<typename T>
311  void
312  XmlParser::set_valueFromAttribute(const TiXmlElement* el, const std::string& name, T& val, Attribute::State state) {
313  switch (state) {
314  case Attribute::GRANOO_REQUIRED:
315  {
316  set_valueFromAttribute_Required<T>(el, name, val);
317  break;
318  }
319  case Attribute::GRANOO_OPTIONAL:
320  {
321  set_valueFromAttribute_Optional<T>(el, name, val);
322  break;
323  }
324  default:
325  {
326  InternAssert(0);
327  }
328  }
329  }
330 
331  template<typename T>
332  void
333  XmlParser::set_valueFromAttribute_Optional(const TiXmlElement* el, const std::string& name, T& val) {
334  val = get_AttributeValue_Optional<T>(el, name, val);
335  }
336 
337  template<typename T> void
338  XmlParser::set_valueFromAttribute_Required(const TiXmlElement* el, const std::string& name, T& val) {
339  val = get_AttributeValue_Required<T>(el, name);
340  }
341 
342  template<typename T>
343  T
344  XmlParser::get_AttributeValue(const TiXmlElement* el, const std::string& name, Attribute::State state, T val) {
345  switch (state) {
346  case Attribute::GRANOO_REQUIRED:
347  {
348  return get_AttributeValue_Required<T>(el, name);
349  break;
350  }
351  case Attribute::GRANOO_OPTIONAL:
352  {
353  return get_AttributeValue_Optional<T>(el, name, val);
354  break;
355  }
356  default:
357  {
358  InternAssert(0);
359  }
360  }
361  InternAssert(0);
362  return val;
363  }
364 
365  template<typename T>
366  T
367  XmlParser::get_AttributeValue_Optional(const TiXmlElement *el, const std::string & name, T val) {
368  if (attribute_exist(el, name))
369  ConvertStringTo(el, el->Attribute(name.c_str()), val);
370  return val;
371  }
372 
373  template<typename T>
374  T
375  XmlParser::get_AttributeValue_Required(const TiXmlElement *el, const std::string & name) {
376  std::string errMsg = "Cannot find the required attribute " + String::quote(name);
377  AssertMsg(attribute_exist(el, name), ErrorMsg(el, errMsg));
378 
379  T val = T();
380  ConvertStringTo(el, el->Attribute(name.c_str()), val);
381  return val;
382  }
383 
384  template <typename ... T>
385  void
386  XmlParser::AllowedValue(const std::string& name, const T& ... args) {
387  std::array<std::string, sizeof...(args)> val{{args ...}};
388  CheckAllowedAttributeValue(name, val);
389  }
390 
391  template<typename T>
392  void
393  XmlParser::AllowedValue(const std::string& name, const T& v) {
394  std::array<T, 1> val = {{v}};
395  CheckAllowedAttributeValue(name, val);
396  }
397 
398  template<typename T>
399  void
400  XmlParser::AllowedValue(const std::string& name, const T& v1, const T& v2) {
401  std::array<T, 2> val = {{v1, v2}};
402  CheckAllowedAttributeValue(name, val);
403  }
404 
405  template<typename T>
406  void
407  XmlParser::AllowedValue(const std::string& name, const T& v1, const T& v2, const T& v3) {
408  std::array<T, 3> val = {{v1, v2, v3}};
409  CheckAllowedAttributeValue(name, val);
410  }
411 
412  template<typename T>
413  void
414  XmlParser::AllowedValue(const std::string& name, const T& v1, const T& v2, const T& v3, const T& v4) {
415  std::array<T, 4> val = {{v1, v2, v3, v4}};
416  CheckAllowedAttributeValue(name, val);
417  }
418 
419  template<typename T>
420  void
421  XmlParser::AllowedValue(const std::string& name, const T& v1, const T& v2, const T& v3, const T& v4, const T& v5) {
422  std::array<T, 5> val = {{v1, v2, v3, v4, v5}};
423  CheckAllowedAttributeValue(name, val);
424  }
425 
426  template<typename T>
427  void
428  XmlParser::AllowedValue(const std::string& name, const T& v1, const T& v2, const T& v3, const T& v4, const T& v5, const T& v6) {
429  std::array<T, 6> val = {{v1, v2, v3, v4, v5, v6}};
430  CheckAllowedAttributeValue(name, val);
431  }
432 
433  template<typename T>
434  void
435  XmlParser::CheckAllowedAttributeValue(const std::string& name, const T& array) {
436  const TiXmlElement* el = get_current_element();
437  if (attribute_exist(el, name) == false)
438  return;
439 
440  const typename T::value_type val = get_AttributeValue_Required<typename T::value_type>(el, name);
441  bool find = false;
442  std::ostringstream allowedVal;
443 
444  for (typename T::const_iterator it = array.begin(); it!=array.end(); ++it) {
445  allowedVal << "'" << *it << "'";
446  if (val == *it)
447  find = true;
448 
449  if (array.size() > 1) {
450  if (it < array.end()-2)
451  allowedVal << ", ";
452  else if (it == array.end()-2)
453  allowedVal << " or ";
454  }
455 
456  }
457 
458  std::ostringstream errMsg;
459  errMsg << "The attribute " << String::quote(name)
460  << " must take the followed values : " << allowedVal.str();
461  AssertMsg(find == true, ErrorMsg(el, errMsg.str()));
462  }
463 
464  template<typename T>
465  void
466  XmlParser::check_allowed_element_name(const T& array) {
467  const TiXmlElement* el = get_current_element();
468 
469  const std::string val = el->Value();
470  bool find = false;
471  std::ostringstream allowedVal;
472 
473  for (typename T::const_iterator it = array.begin(); it!=array.end(); ++it) {
474  allowedVal << "'" << *it << "'";
475  if (val == *it)
476  find = true;
477 
478  if (array.size() > 1) {
479  if (it < array.end()-2)
480  allowedVal << ", ";
481  else if (it == array.end()-2)
482  allowedVal << " or ";
483  }
484 
485  }
486 
487  std::ostringstream errMsg;
488  errMsg << "The name of the current element must be : " << allowedVal.str();
489  AssertMsg(find == true, ErrorMsg(el, errMsg.str()));
490  }
491 
492  template<typename T>
493  void
495  const TiXmlElement* el = get_current_element();
496 
497  const std::string val = get_child_element_required(el)->Value();
498  bool find = false;
499  std::ostringstream allowedVal;
500 
501  for (typename T::const_iterator it = array.begin(); it!=array.end(); ++it) {
502  allowedVal << "'" << *it << "'";
503  if (val == *it)
504  find = true;
505 
506  if (array.size() > 1) {
507  if (it < array.end()-2)
508  allowedVal << ", ";
509  else if (it == array.end()-2)
510  allowedVal << " or ";
511  }
512 
513  }
514 
515  std::ostringstream errMsg;
516  errMsg << "This element must have a unique child. This child must be : " << allowedVal.str();
517  AssertMsg(find == true, ErrorMsg(el, errMsg.str()));
518  }
519 
520  template<typename T>
521  void
522  XmlParser::ConvertStringTo(const TiXmlElement* el, const std::string& str, T& val) {
523  try {
524  val = boost::lexical_cast<T>(str);
525  }
526  catch (const boost::bad_lexical_cast&) {
527  std::string errMsg = "Cannot convert the characters \"" + str + "\" to type " + String::quote(TypeName<T>());
528  AssertMsg(0, ErrorMsg(el, errMsg));
529  }
530  }
531 
532  template<typename T>
533  void
534  XmlParser::ConvertStringTo(const TiXmlElement* el, const std::string& str, std::vector<T>& val) {
535  val.clear();
536  std::vector<std::string> strList;
537  boost::split(strList, str, boost::is_any_of(Core::String::sep));
538  val.resize(strList.size());
539  for (unsigned int i = 0; i < strList.size(); ++i) {
540  ConvertStringTo(el, strList[i], val[i]);
541  }
542  }
543 
544  template<typename T>
545  void
546  XmlParser::ConvertStringTo(const TiXmlElement* el, const std::string& str, Core::SetOf<T>*& val) {
547  val = &Core::SetOf<T>::get(str);
548  }
549 
550 
551  template<> void
552  XmlParser::ConvertStringTo(const TiXmlElement* el, const std::string& str, int& val);
553 
554  template<> void
555  XmlParser::ConvertStringTo(const TiXmlElement* el, const std::string& str, unsigned int& val);
556 
557 
558  template<> void
559  XmlParser::ConvertStringTo(const TiXmlElement* el, const std::string& str, double& val);
560 
561  template<> void
562  XmlParser::ConvertStringTo(const TiXmlElement* el, const std::string& str, bool& val);
563 
564  template<> void
565  XmlParser::ConvertStringTo(const TiXmlElement* el, const std::string& str, Math::Expression& val);
566 
567  template<> void
568  XmlParser::ConvertStringTo(const TiXmlElement* el, const std::string& str, Math::Expression*& val);
569 
570  template<> void
571  XmlParser::ConvertStringTo(const TiXmlElement* el, const std::string& str, Geom::Vector& vec);
572 
573  template<> void
574  XmlParser::ConvertStringTo(const TiXmlElement* el, const std::string& str, Geom::Vector*& vec);
575 
576  template<> void
577  XmlParser::ConvertStringTo(const TiXmlElement* el, const std::string& str, Geom::Point& pt);
578 
579  template<> void
580  XmlParser::ConvertStringTo(const TiXmlElement* el, const std::string& str, Geom::Point*& pt);
581 
582  template<> void
583  XmlParser::ConvertStringTo(const TiXmlElement* el, const std::string& str, Geom::Quaternion& quat);
584 
585  template<> void
586  XmlParser::ConvertStringTo(const TiXmlElement* el, const std::string& str, Geom::Quaternion*& quat);
587 
588 
589  template<typename T> std::string XmlParser::TypeName() {
590  return typeid(T).name();
591  }
592 
593  template<> std::string XmlParser::TypeName<double>();
594  template<> std::string XmlParser::TypeName<int>();
595  template<> std::string XmlParser::TypeName<unsigned int>();
596  template<> std::string XmlParser::TypeName<bool>();
597  template<> std::string XmlParser::TypeName<float>();
598  template<> std::string XmlParser::TypeName<Geom::Vector>();
599  template<> std::string XmlParser::TypeName<Geom::Point>();
600  template<> std::string XmlParser::TypeName<Math::Expression>();
601 
602 
603 #endif
604  }
605 
606  namespace Attr = Core::Attribute;
607  namespace El = Core::Element;
608 
609 }
610 
611 #endif
#define InternAssert(condition)
Definition: Macro.hpp:81
#define AssertMsg(condition, message)
Definition: Macro.hpp:67
static SetOf< type > & get()
Definition: XmlParser.hpp:84
static void read_xml_file(const std::string &xPathParent, const std::string &filename=Core::String::empty_string)
static void add_item(const std::string &, T *)
Definition: XmlObjectManager.hpp:102
XmlObjectManager(const XmlObjectManager &)
static T * read_element(const TiXmlElement *, bool ID_required=true)
Definition: XmlObjectManager.hpp:160
static bool exist(const std::string &)
Definition: XmlObjectManager.hpp:110
static void clear()
Definition: XmlObjectManager.hpp:133
static std::string class_ID()
Definition: XmlParser.hpp:93
static std::vector< std::string > get_ID()
Definition: XmlObjectManager.hpp:190
static void erase_item(const T *)
Definition: XmlObjectManager.hpp:148
static T & get(const std::string &)
Definition: XmlObjectManager.hpp:115
static std::string get_list()
Definition: XmlObjectManager.hpp:94
static std::map< const std::string, T * > map_
Definition: XmlParser.hpp:100
XmlObjectManager & operator=(const XmlObjectManager &)
static T * get_item(const std::string &)
Definition: XmlObjectManager.hpp:124
Definition: XmlParser.hpp:122
std::string ErrorMsg(const std::string) const
bool attribute_exist(const std::string &)
std::string ErrorMsg(const TiXmlNode *, const std::string) const
void ConvertStringTo(const TiXmlElement *, const std::string &, Core::SetOf< T > *&)
void check_unique_child_with_allowed_element_name(const T &)
T read_attribute(const Attribute::State, const std::string &)
const TiXmlElement * get_root_element(const std::string &)
void set_valueFromAttribute_Required(const TiXmlElement *, const std::string &, T &)
const TiXmlElement * _current_element
Definition: XmlParser.hpp:247
static XmlParser * _me
Definition: XmlParser.hpp:239
const TiXmlElement * get_child_element_unique(const TiXmlNode *)
void check_allowed_element_name(const T &)
static XmlParser & get()
static XmlParser & open_memory(const std::string &, const std::string &)
void ConvertStringTo(const TiXmlElement *, const std::string &, std::vector< T > &)
std::vector< const TiXmlElement * > get_all_document_element() const
T read_attribute(const std::string &, T)
const TiXmlElement * get_child_element_required(const TiXmlNode *, const std::string &)
void AddAllowedAttributeName(const TiXmlElement *, const std::string &)
void AllowedValue(const std::string &name, const T &, const T &, const T &, const T &)
const TiXmlElement * get_child_element(const Element::State, const TiXmlNode *)
void raise_assertion(bool, int, const std::string &, const std::string &, const std::string &)
const TiXmlElement * get_root_element()
bool has_been_read(const TiXmlElement *) const
std::map< const TiXmlElement *, std::vector< std::string > > _allowed_attribute_name
Definition: XmlParser.hpp:244
void set_valueFromAttribute_Optional(const TiXmlElement *, const std::string &, T &)
std::string RawText(const TiXmlNode *, const unsigned int maxLength=0) const
void check_attribute_in_conflict(const std::string &, const std::string &)
T get_AttributeValue_Optional(const TiXmlElement *, const std::string &, T=T())
const std::vector< std::string > & get_allowedAttributeNamelist(const TiXmlElement *)
void set_valueFromAttribute(const TiXmlElement *, const std::string &, T &, Attribute::State)
T get_AttributeValue(const TiXmlElement *, const std::string &, Attribute::State, T=T())
void AllowedValue(const std::string &name, const T &)
void CheckAllowedAttributeValue(const std::string &name, const T &)
std::string ErrorMsg() const
void AllowedValue(const std::string &name, const T &, const T &, const T &, const T &, const T &)
XmlParser(const std::string &, const std::string &)
const TiXmlElement * _root_element
Definition: XmlParser.hpp:246
T read_attribute(const TiXmlElement *, const std::string &, T)
void get_all_document_element_recursive(const TiXmlElement *, std::vector< const TiXmlElement * > &) const
std::vector< const TiXmlElement * > _element_read
Definition: XmlParser.hpp:245
const TiXmlElement * get_child_element_optional(const TiXmlNode *)
const TiXmlElement * get_child_element_unique(const TiXmlNode *, const std::string &)
void AllowedValue(const std::string &name, const T &, const T &, const T &, const T &, const T &, const T &)
void AllowedValue(const std::string &name, const T &, const T &)
XmlParser(const std::string &)
TiXmlDocument _doc
Definition: XmlParser.hpp:243
T get_AttributeValue_Required(const TiXmlElement *, const std::string &)
void read_attribute(const Attribute::State, const TiXmlElement *, const std::string &, T &)
const TiXmlDocument & get_xml_doc() const
static XmlParser & open(const std::string &)
T read_attribute(const Attribute::State, const TiXmlElement *, const std::string &)
const TiXmlElement * get_current_element()
void AllowedValue(const std::string &name, const T &...)
void read_attribute(const Attribute::State, const std::string &, T &)
void AllowedValue(const std::string &name, const T &, const T &, const T &)
void raise_assertion(const TiXmlElement *, const int, const std::string &, const std::string &, const std::string &)
const TiXmlElement * get_child_element_optional(const TiXmlNode *, const std::string &)
void check_attribute_in_conflict(const TiXmlElement *, const std::string &, const std::string &)
void set_current_element(const TiXmlElement *)
TiXmlDocument & get_xml_doc()
bool attribute_exist(const TiXmlElement *, const std::string &)
const TiXmlElement * get_child_element_required(const TiXmlNode *)
void check_unread_attribute(const TiXmlElement *)
void ConvertStringTo(const TiXmlElement *, const std::string &, T &)
const std::string _doc_name
Definition: XmlParser.hpp:242
const TiXmlElement * get_child_element(const Element::State, const TiXmlNode *, const std::string &)
State
Definition: XmlParser.hpp:118
State
Definition: XmlParser.hpp:119
State
Definition: XmlParser.hpp:116
Definition: Common.hpp:198
T value(details::expression_node< T > *n)
Definition: Exprtk.hpp:15070
static std::string quote(const std::string &str)
Definition: String.cpp:73
static const std::string sep
Definition: String.hpp:46
static const std::string empty_string
Definition: String.hpp:45