元素C 中使用Expat解析XML

c xml  时间:2021-02-14  阅读:()

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, &AMP;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标准的知识如果需要可以参考官方的手册。

DMIT:美国cn2 gia线路vps,高性能 AMD EPYC/不限流量(Premium Unmetered),$179.99/月起

DMIT怎么样?DMIT最近动作频繁,前几天刚刚上架了日本lite版VPS,正在酝酿上线日本高级网络VPS,又差不多在同一时间推出了美国cn2 gia线路不限流量的美国云服务器,不过价格太过昂贵。丐版只有30M带宽,月付179.99美元 !!目前,美国云服务器已经有个4个套餐,分别是,Premium(cn2 gia线路)、Lite(普通直连)、Premium Secure(带高防的cn2 gia线...

BuyVM新设立的迈阿密机房速度怎么样?简单的测评速度性能

BuyVM商家算是一家比较老牌的海外主机商,公司设立在加拿大,曾经是低价便宜VPS主机的代表,目前为止有提供纽约、拉斯维加斯、卢森堡机房,以及新增加的美国迈阿密机房。如果我们有需要选择BuyVM商家的机器需要注意的是注册信息的时候一定要规范,否则很容易出现欺诈订单,甚至你开通后都有可能被禁止账户,也是这个原因,曾经被很多人吐槽的。这里我们简单的对于BuyVM商家新增加的迈阿密机房进行简单的测评。如...

江苏云服务器 2H2G 20M 79元/月 大宽带159元/月 高性能挂机宝6元/月 香港CN2 GIA、美国200G防御 CN2 GIA 折后18元/月 御速云

介绍:御速云成立于2021年的国人商家,深圳市御速信息技术有限公司旗下品牌,为您提供安全可靠的弹性计算服务,随着业务需求的变化,您可以实时扩展或缩减计算资源,使用弹性云计算可以极大降低您的软硬件采购成本,简化IT运维工作。主要从事VPS、虚拟主机、CDN等云计算产品业务,适合建站、新手上车的值得选择,拥有华东江苏、华东山东等国内优质云产品;香港三网直连(电信CN2GIA联通移动CN2直连);美国高...

c xml为你推荐
怎么在qq空间里添加背景音乐如何在QQ空间中添加背景音乐吴晓波频道买粉《吴晓波频道》《罗辑思维》《专栏精粹》怎么评价?不兼容WIN7 64位系统与某些软件不兼容怎么办?怎么点亮qq空间图标QQ空间的图标怎么点亮xp系统停止服务Windowsxp系统为什么停止服务创维云电视功能创维新出的4K超高清健康云电视有谁用过,功能效果怎么样?ejb开发EJB是什么?虚拟机软件下载谁有好的虚拟机软件?263企业邮箱设置ipad mini2怎么设置263企业邮箱优锁笔记本电脑怎么样防止被盗
asp虚拟空间 中文域名查询 duniu stablehost yardvps la域名 sockscap 网通服务器ip mysql主机 最好看的qq空间 ibrs 网通ip 刀片式服务器 91vps 服务器是干什么的 免费高速空间 申请网页 七夕快乐英语 云营销系统 个人免费邮箱 更多