#include "tinyxml.h" #include #include #include using namespace std; /** **/ const char* AssembleXml(char* elemvalue, char* attrname1, char* attrvalue1, char* attrname2, char* attrvalue2, char* attrname3, char* attrvalue3 ...); const char* AssembleXml2(int num, char* format, ...); int main() { const char* start = AssembleXml("monitor","action","start",NULL,NULL,NULL,NULL); printf("%s/n",start); const char* stop = AssembleXml("monitor","action","stop",NULL,NULL,NULL,NULL); printf("%s/n",stop); const char* catchmonitor = AssembleXml("capturescreen",NULL,NULL,NULL,NULL,NULL,NULL); printf("%s/n",catchmonitor); const char* requestvolume = AssembleXml("volume","action","get",NULL,NULL,NULL,NULL); printf("%s/n",requestvolume); const char* setvolume = AssembleXml2(5,"volume","action","set","value","12"); printf("%s/n",setvolume); const char* controlterminal = AssembleXml("control","action","shutdown",NULL,NULL,NULL,NULL); printf("%s/n",controlterminal); const char* controlterminal1 = AssembleXml2(7,"control1","action1","shutdown1","name","zz","age","25"); printf("%s/n",controlterminal1); return 0; } const char* AssembleXml(char* elemvalue, char* attrname1, char* attrvalue1, char* attrname2, char* attrvalue2, char* attrname3, char* attrvalue3 ...) { if(elemvalue == NULL) return NULL; TiXmlDocument doc; TiXmlDeclaration* dec = new TiXmlDeclaration("1.0","utf-8",""); doc.LinkEndChild(dec); TiXmlElement* root = new TiXmlElement("result"); doc.LinkEndChild(root); root->SetAttribute("dmbversion","2.0"); root->SetAttribute("sequence","0"); root->SetAttribute("type","server"); TiXmlElement* elem = new TiXmlElement(elemvalue); root->LinkEndChild(elem); if(attrname1 != NULL) elem->SetAttribute(attrname1,attrvalue1); if(attrname2 != NULL) elem->SetAttribute(attrname2,attrvalue2); if(attrname3 != NULL) elem->SetAttribute(attrname3,attrvalue3); //doc.SaveFile("work.xml"); TiXmlPrinter printer; doc.Accept(&printer); string s = printer.CStr(); return s.c_str(); } const char* AssembleXml2(int num, char* format, ...) { if(format == NULL) return NULL; TiXmlDocument doc; TiXmlDeclaration* dec = new TiXmlDeclaration("1.0","utf-8",""); doc.LinkEndChild(dec); TiXmlElement* root = new TiXmlElement("result"); doc.LinkEndChild(root); root->SetAttribute("dmbversion","2.0"); root->SetAttribute("sequence","0"); root->SetAttribute("type","server"); va_list arg; char* chr; char* e_name; char* e_value; TiXmlElement* elem; / va_start(arg, format); int count = 0; // int i ; elem = new TiXmlElement(format); root->LinkEndChild(elem); while(num-1 > 0) { //chr = (char*)(va_arg(arg, int)); chr = va_arg(arg, char*); if(count%2 == 0) { e_name = chr; } if(count%2 == 1) { e_value = chr; elem->SetAttribute(e_name,e_value); } num--; count++; } va_end (arg); TiXmlPrinter printer; doc.Accept(&printer); string s = printer.CStr(); return s.c_str(); }
有点懒,所以也就不想做提取那种体力活了,主要想记下自己写的变参函数,变参操作就是/
包含的部分,
一般的用法是这样:
va_list args; //声明变量
va_start(args, fmt); //开始解析。args指向fmt后面的参数
TYPE var = va_arg(args, TYPE); //取下一个参数并返回。args指向下一个参数
这个函数比较烦人,linux下老出现段错误,关键在于控制循环次数,至少我是没办法了,至少是现在还向不出,只能在应用时输入参数数量进行流程控制,有人说要数据对齐什么的,所以通常会写成va_arg(...,int)的形式,我用char*也没啥反应,还省的类型转换了,呵呵!
va_end(args); //结束解析
这个是在写一个模块时,要组装xml,协议定好的,但是部分值不确定数量,所以也是懒了才写个变参的,至少不用一个个组装,我很懒的。有个头文件tinyxml.h是xml解析库,可以无视……还有留那么多主要原因是显得行数多,呵呵!凑字数...