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

易探云:香港物理机服务器仅550元/月起;E3-1230/16G DDR3/SATA 1TB/香港BGP/20Mbps

易探云怎么样?易探云(yitanyun.com)是一家知名云计算品牌,2017年成立,从业4年之久,目前主要从事出售香港VPS、香港独立服务器、香港站群服务器等,在售VPS线路有三网CN2、CN2 GIA,该公司旗下产品均采用KVM虚拟化架构。目前,易探云推出免备案香港物理机服务器性价比很高,E3-1230 8 核*1/16G DDR3/SATA 1TB/香港BGP线路/20Mbps/不限流量,仅...

易探云:香港大带宽/大内存物理机服务器550元;20Mbps带宽!三网BGP线路

易探云怎么样?易探云隶属于纯乐电商旗下网络服务品牌,香港NTT Communications合作伙伴,YiTanCloud Limited旗下合作云计算品牌,数十年云计算行业经验。发展至今,我们已凝聚起港内领先的开发和运维团队,积累起4年市场服务经验,提供电话热线/在线咨询/服务单系统等多种沟通渠道,7*24不间断服务,3分钟快速响应。目前,易探云提供香港大带宽20Mbps、16G DDR3内存、...

raksmart:年中大促,美国物理机$30/月甩卖;爆款VPS仅月付$1.99;洛杉矶/日本/中国香港多IP站群$177/月

RAKsmart怎么样?RAKsmart发布了2021年中促销,促销时间,7月1日~7月31日!,具体促销优惠整理如下:1)美国西海岸的圣何塞、洛杉矶独立物理服务器低至$30/月(续费不涨价)!2)中国香港大带宽物理机,新品热卖!!!,$269.23 美元/月,3)站群服务器、香港站群、日本站群、美国站群,低至177美元/月,4)美国圣何塞,洛杉矶10G口服务器,不限流量,惊爆价:$999.00,...

c xml为你推荐
根目录请问什么是根目录最新qq空间代码QQ空间代码有哪些???在线代理网站求有效的代理服务器地址?vbscript教程请教一下高手们,这个VBS脚本难不难啊,我想学学这个,但是又不知道该从哪入手,希望高手指点指点??qq空间打扮QQ空间打扮bt封杀现在是全面封杀BT下载了吗?现在都找不到BT下载影片了ios系统iOS系统是什么bluestackbluestacks下载的东西在哪三星s8什么时候上市三星s8什么时候上市 三星s8上市时间blogcnblogcn的博客可以搬家到哪些网站?
免费vps 花生壳免费域名 新世界机房 simcentric highfrequency hostmonster 10t等于多少g 512av 青果网 免费博客空间 ibox官网 有益网络 softbank邮箱 129邮箱 免费测手机号 hkt 便宜空间 带宽租赁 域名转入 购买空间 更多