62 #include <visp/vpConfig.h>
65 #if defined(VISP_HAVE_XML2)
67 #include <visp/vpXmlParser.h>
68 #include <visp/vpDebug.h>
69 #include <visp/vpIoTools.h>
70 #include <visp/vpParseArgv.h>
75 #ifndef DOXYGEN_SHOULD_SKIP_THIS
104 vpExampleDataParser();
105 virtual ~vpExampleDataParser();
108 double getRange()
const {
return m_range;}
109 int getStep()
const {
return m_step;}
110 int getSizeFilter()
const {
return m_size_filter;}
111 std::string getName()
const {
return m_name;}
113 void setRange(
const double _range) {m_range = _range;}
114 void setStep(
const int _step) {m_step = _step;}
115 void setSizeFilter(
const int _size_filter) {m_size_filter = _size_filter;}
116 void setName(
const std::string& _name) { m_name = _name;}
129 vpExampleDataParser::vpExampleDataParser()
130 : m_range(0.), m_step(0), m_size_filter(0), m_name(
"")
132 nodeMap[
"config"] = config;
133 nodeMap[
"range"] = range;
134 nodeMap[
"step"] = step;
135 nodeMap[
"size_filter"] = size_filter;
136 nodeMap[
"name"] = name;
143 vpExampleDataParser::~vpExampleDataParser()
157 vpExampleDataParser::readMainClass (xmlDocPtr doc, xmlNodePtr node)
159 for(xmlNodePtr dataNode = node->xmlChildrenNode; dataNode != NULL; dataNode = dataNode->next) {
160 if(dataNode->type == XML_ELEMENT_NODE){
161 std::map<std::string, int>::iterator iter_data= this->nodeMap.find((
char*)dataNode->name);
162 if(iter_data != nodeMap.end()){
163 switch (iter_data->second){
165 this->m_range = xmlReadDoubleChild(doc, dataNode);
168 this->m_step = xmlReadIntChild(doc, dataNode);
171 this->m_size_filter = xmlReadIntChild(doc, dataNode);
174 this->m_name = xmlReadStringChild(doc, dataNode);
177 vpTRACE(
"unknown tag in readConfigNode : %d, %s", iter_data->second, (iter_data->first).c_str());
193 vpExampleDataParser::writeMainClass(xmlNodePtr node)
195 xmlWriteDoubleChild(node, (
const char*)
"range", m_range);
196 xmlWriteIntChild(node, (
const char*)
"step", m_step);
197 xmlWriteIntChild(node, (
const char*)
"size_filter", m_size_filter);
198 xmlWriteCharChild(node, (
const char*)
"name", m_name.c_str());
209 #define GETOPTARGS "o:h"
211 void usage(
const char *name,
const char *badparam,
const std::string& opath,
const std::string& user);
212 bool getOptions(
int argc,
const char **argv, std::string &opath,
const std::string& user);
224 void usage(
const char *name,
const char *badparam,
const std::string& opath,
const std::string& user)
227 Write and read data in a xml file.\n\
230 %s [-o <output image path>] [-h]\n", name);
234 -o <output data path> %s\n\
235 Set data output path.\n\
236 From this directory, creates the \"%s\"\n\
237 subdirectory depending on the username, where \n\
238 dataTestXml.xml file is written.\n\
241 Print the help.\n\n", opath.c_str(), user.c_str());
244 fprintf(stderr,
"ERROR: \n" );
245 fprintf(stderr,
"\nBad parameter [%s]\n", badparam);
258 bool getOptions(
int argc,
const char **argv, std::string &opath,
const std::string& user)
265 case 'o': opath = optarg_;
break;
266 case 'h': usage(argv[0], NULL, opath, user);
return false;
break;
269 usage(argv[0], optarg_, opath, user);
return false;
break;
273 if ((c == 1) || (c == -1)) {
275 usage(argv[0], NULL, opath, user);
276 std::cerr <<
"ERROR: " << std::endl;
277 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
290 int main(
int argc,
const char** argv)
293 std::string opt_opath;
295 std::string filename;
296 std::string username;
298 std::cout <<
"-------------------------------------------------------" << std::endl ;
299 std::cout <<
" testXmlParser.cpp" <<std::endl << std::endl ;
300 std::cout <<
" writing and readind data using a xml parser" << std::endl ;
301 std::cout <<
"-------------------------------------------------------" << std::endl ;
302 std::cout << std::endl ;
305 #if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__))) // UNIX
307 #elif defined(_WIN32)
308 opt_opath =
"C:\\temp";
315 if (getOptions(argc, argv, opt_opath, username) ==
false) {
320 if (!opt_opath.empty())
333 usage(argv[0], NULL, opath, username);
334 std::cerr << std::endl
335 <<
"ERROR:" << std::endl;
336 std::cerr <<
" Cannot create " << dirname << std::endl;
337 std::cerr <<
" Check your -o " << opath <<
" option " << std::endl;
346 vpExampleDataParser parser1;
349 parser1.setRange(3.5);
351 parser1.setSizeFilter(5);
352 parser1.setName(
"cube");
354 std::cout <<
"Write data to " << filename << std::endl;
355 parser1.save(filename);
360 vpExampleDataParser parser2;
362 parser2.parse(filename);
364 std::cout <<
"Read from " << filename << std::endl ;
365 std::cout <<
"Range : " << parser2.getRange() << std::endl;
366 std::cout <<
"Step : " << parser2.getStep() << std::endl;
367 std::cout <<
"Filter size : " << parser2.getSizeFilter() << std::endl;
368 std::cout <<
"name : " << parser2.getName() << std::endl;
376 std::cout <<
"Catch an exception: " << e << std::endl;
385 std::cout <<
"Xml parser requires libxml2." << std::endl;
error that can be emited by ViSP classes.
virtual void writeMainClass(xmlNodePtr node)=0
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)
This class intends to simplify the creation of xml parser based on the libxml2 third party library...
virtual void readMainClass(xmlDocPtr doc, xmlNodePtr node)=0