36 #include <visp3/core/vpConfig.h>
37 #include <visp3/core/vpXmlParser.h>
41 #include <libxml/parser.h>
42 #include <visp3/core/vpDebug.h>
43 #include <visp3/core/vpException.h>
99 if (node->xmlChildrenNode ==
nullptr) {
100 std::string errorMsg =
"Empty node " + std::string((
char *)node->name) +
", cannot read char*";
101 std::cerr << errorMsg << std::endl;
104 return (
char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
119 if (node->xmlChildrenNode ==
nullptr) {
120 std::string errorMsg =
"Empty node " + std::string((
char *)node->name) +
", cannot read std::string";
121 std::cerr << errorMsg << std::endl;
124 char *dataCh = (
char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
125 std::string dataStr = dataCh;
143 if (node->xmlChildrenNode ==
nullptr) {
144 std::string errorMsg =
"Empty node " + std::string((
char *)node->name) +
", cannot read int";
145 std::cerr << errorMsg << std::endl;
149 char *control_convert;
152 val_char = (
char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
153 val_int = (int)strtol((
char *)val_char, &control_convert, 10);
155 if (val_char == control_convert) {
156 xmlFree((xmlChar *)val_char);
159 xmlFree((xmlChar *)val_char);
177 if (node->xmlChildrenNode ==
nullptr) {
178 std::string errorMsg =
"Empty node " + std::string((
char *)node->name) +
", cannot read unsigned int";
179 std::cerr << errorMsg << std::endl;
183 char *control_convert;
184 unsigned int val_uint;
186 val_char = (
char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
187 val_uint = (
unsigned int)strtoul((
char *)val_char, &control_convert, 10);
189 if (val_char == control_convert) {
190 xmlFree((xmlChar *)val_char);
193 xmlFree((xmlChar *)val_char);
211 if (node->xmlChildrenNode ==
nullptr) {
212 std::string errorMsg =
"Empty node " + std::string((
char *)node->name) +
", cannot read double";
213 std::cerr << errorMsg << std::endl;
217 char *control_convert;
220 val_char = (
char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
221 val_double = strtod((
char *)val_char, &control_convert);
223 if (val_char == control_convert) {
224 xmlFree((xmlChar *)val_char);
227 xmlFree((xmlChar *)val_char);
244 if (node->xmlChildrenNode ==
nullptr) {
245 std::string errorMsg =
"Empty node " + std::string((
char *)node->name) +
", cannot read float";
246 std::cerr << errorMsg << std::endl;
250 char *control_convert;
253 val_char = (
char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
254 #if defined(VISP_HAVE_FUNC_STRTOF)
255 val_float = strtof((
char *)val_char, &control_convert);
257 val_float = (float)strtod((
char *)val_char, &control_convert);
260 if (val_char == control_convert) {
261 xmlFree((xmlChar *)val_char);
264 xmlFree((xmlChar *)val_char);
281 if (node->xmlChildrenNode ==
nullptr) {
282 std::string errorMsg =
"Empty node " + std::string((
char *)node->name) +
", cannot read bool";
283 std::cerr << errorMsg << std::endl;
289 val_char = (
char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
290 val_bool = val_char[0] !=
'0';
292 xmlFree((xmlChar *)val_char);
306 tmp = xmlNewChild(node,
nullptr, (xmlChar *)label, (xmlChar *)value);
307 xmlAddChild(node, tmp);
320 tmp = xmlNewChild(node,
nullptr, (xmlChar *)label, (xmlChar *)value.c_str());
321 xmlAddChild(node, tmp);
334 snprintf(str, 100,
"%d", value);
336 tmp = xmlNewChild(node,
nullptr, (xmlChar *)label, (xmlChar *)str);
337 xmlAddChild(node, tmp);
350 snprintf(str, 100,
"%u", value);
352 tmp = xmlNewChild(node,
nullptr, (xmlChar *)label, (xmlChar *)str);
353 xmlAddChild(node, tmp);
366 snprintf(str, 100,
"%lf", value);
368 tmp = xmlNewChild(node,
nullptr, (xmlChar *)label, (xmlChar *)str);
369 xmlAddChild(node, tmp);
382 snprintf(str, 100,
"%f", value);
384 tmp = xmlNewChild(node,
nullptr, (xmlChar *)label, (xmlChar *)str);
385 xmlAddChild(node, tmp);
398 snprintf(str, 2,
"%d", (
int)value);
400 tmp = xmlNewChild(node,
nullptr, (xmlChar *)label, (xmlChar *)str);
401 xmlAddChild(node, tmp);
421 xmlNodePtr root_node;
423 doc = xmlParseFile(filename.c_str());
424 if (doc ==
nullptr) {
429 root_node = xmlDocGetRootElement(doc);
430 if (root_node ==
nullptr) {
453 xmlNodePtr root_node;
455 doc = xmlReadFile(filename.c_str(),
nullptr, XML_PARSE_NOWARNING + XML_PARSE_NOERROR + XML_PARSE_NOBLANKS);
456 if (doc ==
nullptr) {
457 doc = xmlNewDoc((xmlChar *)
"1.0");
458 root_node = xmlNewNode(
nullptr, (xmlChar *)
main_tag.c_str());
459 xmlDocSetRootElement(doc, root_node);
463 if (remove(filename.c_str()) != 0)
466 doc = xmlNewDoc((xmlChar *)
"1.0");
467 root_node = xmlNewNode(
nullptr, (xmlChar *)
main_tag.c_str());
468 xmlDocSetRootElement(doc, root_node);
472 root_node = xmlDocGetRootElement(doc);
473 if (root_node ==
nullptr) {
480 xmlSaveFormatFile(filename.c_str(), doc, 1);
484 #elif !defined(VISP_BUILD_SHARED_LIBS)
487 void dummy_vpXmlParser(){};
error that can be emitted by ViSP classes.
void xmlWriteIntChild(xmlNodePtr node, const char *label, int value)
void xmlWriteBoolChild(xmlNodePtr node, const char *label, bool value)
void xmlWriteFloatChild(xmlNodePtr node, const char *label, float value)
double xmlReadDoubleChild(xmlDocPtr doc, xmlNodePtr node)
void xmlWriteDoubleChild(xmlNodePtr node, const char *label, double value)
float xmlReadFloatChild(xmlDocPtr doc, xmlNodePtr node)
void xmlWriteUnsignedIntChild(xmlNodePtr node, const char *label, unsigned int value)
void xmlWriteCharChild(xmlNodePtr node, const char *label, const char *value)
void xmlWriteStringChild(xmlNodePtr node, const char *label, const std::string &value)
int xmlReadIntChild(xmlDocPtr doc, xmlNodePtr node)
void save(const std::string &filename, bool append=false)
bool xmlReadBoolChild(xmlDocPtr doc, xmlNodePtr node)
unsigned int xmlReadUnsignedIntChild(xmlDocPtr doc, xmlNodePtr node)
void parse(const std::string &filename)
char * xmlReadCharChild(xmlDocPtr doc, xmlNodePtr node)
virtual void readMainClass(xmlDocPtr doc, xmlNodePtr node)=0
std::string xmlReadStringChild(xmlDocPtr doc, xmlNodePtr node)
virtual void writeMainClass(xmlNodePtr node)=0