C++中使用Exp at解析XML
使用exp at的原因很多主要还是因为exp at更灵活。习惯了TinyXML一开始不太习惯exp at分析一下其实很容易上手的。
1.回调函数
以下案例解析xml文件中的elment attribute和t ext。 exp at使用回调方式返回xml数据解析器解析到一个elem ent及其内部属性后将调用事先设置好的函数同样当ele ment结束和text结束后也会分别调用对应的函数。
2.如何处理数据之间的包含关系
典型的方式是定义三个函数分别处理elment开始含属性、elem ent结束和文本内容。回调函数的第一个参数是自定义的通常用于存储XML文档的上下文信息用XML_S etUs erData可以设置这个参数下例中传递一个整数指针以便在每次回调时能知道该元素是第几层元素。
该参数也可以是一个栈对象的地址开始一个元素时将新元素对应的数据压入堆栈处理下一级元素时新元素是栈顶元素在子元素然后处理完了继续把该元素压入堆栈继续下一级新的子元素。当元素结束后需要出栈以便解析下个兄弟元素程时能取到父节点。
好啦基本应用还是很简单的实际上Exp at的AP I函数不多。
3.如何处理属性
属性通过Eleme ntH andler回调函数传入这里有一个c har**atts就是属性这是一个字符指针数组如果有N个属性数组大小就是2*N+1最后一个素组元素为空指针奇数指针对应属性名称偶数指针对应属性值字符串格式。可以在一个循环中处理多个属性当遇到空指针时表示没有/ic comp any/”target=“_blank”>>
#inc lud e ”“
#pragma warning(disable:4996)
#define XML_FMT_INT_MOD ”l”
static void XMLCALL startElement(void *userData,
const char *name, const char **atts){int i;int *depthPtr = (int *)us erData;fo r (i = 0; i < *d ep thP tr; i++)p rintf(“ ”);p rintf(nA ME);
*depthPtr += 1;for(i=0;atts[i]!=0;i+=2)
{p rintf(“ %s=%s”,atts[i],atts[i+1]);
}p rintf(“\n”);
}static void XMLCALL endElement(void *userData,const char *name)
{int *depthPtr = (int *)us erData;
*depthPtr -= 1;
}int main(int argc, char *argv[])
{char buf[BUFSIZ]; XML_Parser parser =
XML_P ars erCreate(NULL);int done; int depth = 0;
XML_S etUs erData(p ars er, &dep th);
XML_S etEle me ntH and l er(p ars er, s tartE le me nt, end E le ment);
F ILE* p F ile= argc<2 ?s tdin : fop en(argv[1],”rb”);do
{ int len = (int)fread(buf, 1, sizeof(buf), pFile);done = len < s izeo f(buf);if (XML_P ars e(p ars er, buf, len, done) ==XML_STATUS_ERROR)
{fprintf(stderr,”%s at line %”
XM L_F MT_INT_MO D ”u\n”,
XML_Erro rS tring(XML_G etErro rC o d e(p ars er)),XML_G etCurrentL ineNumb er(p ars er));return 1;
}
}while (!d o ne);
XML_P ars erFree(p ars er);fclose(pFile);return 0;
}
4.其他Elem entHan ld erexp at还可以设置C Data Comment的hand ler另外一些函数本人还没使用过涉及到更多的xml标准的知识如果需要可以参考官方的手册。
有一段时间没有分享Gcore(gcorelabs)的信息了,这是一家成立于2011年的国外主机商,总部位于卢森堡,主要提供VPS主机和独立服务器租用等,数据中心包括俄罗斯、美国、日本、韩国、新加坡、荷兰、中国(香港)等多个国家和地区的十几个机房,商家针对不同系列的产品分为不同管理系统,比如VPS(Hosting)、Cloud等都是独立的用户中心体系,部落分享的主要是商家的Hosting(Virtu...
SoftShellWeb是一家2019年成立的国外主机商,商家在英格兰注册,提供的产品包括虚拟主机和VPS,其中VPS基于KVM架构,采用SSD硬盘,提供IPv4+IPv6,可选美国(圣何塞)、荷兰(阿姆斯特丹)和台湾(台北)等机房。商家近期推出台湾和荷兰年付特价VPS主机,其中台湾VPS最低年付49美元,荷兰VPS年付24美元起。台湾VPSCPU:1core内存:2GB硬盘:20GB SSD流量...
搬瓦工最近上线了一个新的荷兰机房,荷兰 EUNL_9 机房,这个 9 的编号感觉也挺随性的,之前的荷兰机房编号是 EUNL_3。这次荷兰新机房 EUNL_9 采用联通 AS9929 高端路线,三网都接入了 AS9929,对于联通用户来说是个好消息,又多了一个选择。对于其他用户可能还是 CN2 GIA 机房更合适一些。其实对于联通用户,这个荷兰机房也是比较远的,相比之下日本软银 JPOS_1 机房可...