30 #ifndef _GranOO_LibUtil_XmlParser_H
31 #define _GranOO_LibUtil_XmlParser_H
41 #include <boost/algorithm/string.hpp>
42 #include <boost/lexical_cast.hpp>
52 #define XmlAssert(condition, message) \
53 GranOO3::Core::XmlParser::get().raise_assertion(!(condition), __LINE__, __FILE__, #condition, message);
59 template<
class T>
class SetOf;
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())+
">");}
96 static std::vector<std::string>
get_ID();
100 static std::map<const std::string, T *>
map_;
116 enum State {GRANOO_REQUIRED=0, GRANOO_OPTIONAL=1, GRANOO_UNIQUE=2};
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};}
158 void raise_assertion(
bool,
int,
const std::string&,
const std::string&,
const std::string&);
168 template <
typename ... T>
175 void AllowedValue(
const std::string& name,
const T&,
const T&,
const T&);
177 void AllowedValue(
const std::string& name,
const T&,
const T&,
const T&,
const T&);
179 void AllowedValue(
const std::string& name,
const T&,
const T&,
const T&,
const T&,
const T&);
181 void AllowedValue(
const std::string& name,
const T&,
const T&,
const T&,
const T&,
const T&,
const T&);
192 std::string
RawText(
const TiXmlNode*,
const unsigned int maxLength = 0)
const;
206 template<
typename T> T
read_attribute(
const TiXmlElement*,
const std::string&, T);
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>&);
229 std::string
ErrorMsg(
const TiXmlNode*,
const std::string)
const;
232 void raise_assertion(
const TiXmlElement*,
const int,
const std::string&,
const std::string&,
const std::string&);
250 #ifndef DOXYGEN_SHOULD_SKIP_THIS
280 T val = Geom::Vector(0.,0, 0.);
286 T val = Geom::Point(0.,0, 0.);
292 T val = Geom::Quaternion(0.,0, 0.,0.);
314 case Attribute::GRANOO_REQUIRED:
316 set_valueFromAttribute_Required<T>(el, name, val);
319 case Attribute::GRANOO_OPTIONAL:
321 set_valueFromAttribute_Optional<T>(el, name, val);
334 val = get_AttributeValue_Optional<T>(el, name, val);
337 template<
typename T>
void
339 val = get_AttributeValue_Required<T>(el, name);
346 case Attribute::GRANOO_REQUIRED:
348 return get_AttributeValue_Required<T>(el, name);
351 case Attribute::GRANOO_OPTIONAL:
353 return get_AttributeValue_Optional<T>(el, name, val);
376 std::string errMsg =
"Cannot find the required attribute " +
String::quote(name);
384 template <
typename ... T>
387 std::array<std::string,
sizeof...(args)> val{{args ...}};
394 std::array<T, 1> val = {{v}};
401 std::array<T, 2> val = {{v1, v2}};
408 std::array<T, 3> val = {{v1, v2, v3}};
415 std::array<T, 4> val = {{v1, v2, v3, v4}};
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}};
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}};
440 const typename T::value_type val = get_AttributeValue_Required<typename T::value_type>(el, name);
442 std::ostringstream allowedVal;
444 for (
typename T::const_iterator it = array.begin(); it!=array.end(); ++it) {
445 allowedVal <<
"'" << *it <<
"'";
449 if (array.size() > 1) {
450 if (it < array.end()-2)
452 else if (it == array.end()-2)
453 allowedVal <<
" or ";
458 std::ostringstream errMsg;
460 <<
" must take the followed values : " << allowedVal.str();
469 const std::string val = el->Value();
471 std::ostringstream allowedVal;
473 for (
typename T::const_iterator it = array.begin(); it!=array.end(); ++it) {
474 allowedVal <<
"'" << *it <<
"'";
478 if (array.size() > 1) {
479 if (it < array.end()-2)
481 else if (it == array.end()-2)
482 allowedVal <<
" or ";
487 std::ostringstream errMsg;
488 errMsg <<
"The name of the current element must be : " << allowedVal.str();
499 std::ostringstream allowedVal;
501 for (
typename T::const_iterator it = array.begin(); it!=array.end(); ++it) {
502 allowedVal <<
"'" << *it <<
"'";
506 if (array.size() > 1) {
507 if (it < array.end()-2)
509 else if (it == array.end()-2)
510 allowedVal <<
" or ";
515 std::ostringstream errMsg;
516 errMsg <<
"This element must have a unique child. This child must be : " << allowedVal.str();
524 val = boost::lexical_cast<T>(str);
526 catch (
const boost::bad_lexical_cast&) {
527 std::string errMsg =
"Cannot convert the characters \"" + str +
"\" to type " +
String::quote(TypeName<T>());
536 std::vector<std::string> strList;
538 val.resize(strList.size());
539 for (
unsigned int i = 0; i < strList.size(); ++i) {
590 return typeid(T).name();
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>();
606 namespace Attr = Core::Attribute;
607 namespace El = Core::Element;
#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 &)
void check_unread_attribute()
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 & 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 &)
void check_unread_element()
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