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

美国多IP站群VPS商家选择考虑因素和可选商家推荐

如今我们很多朋友做网站都比较多的采用站群模式,但是用站群模式我们很多人都知道要拆分到不同IP段。比如我们会选择不同的服务商,不同的机房,至少和我们每个服务器的IP地址差异化。于是,我们很多朋友会选择美国多IP站群VPS商家的产品。美国站群VPS主机商和我们普通的云服务器、VPS还是有区别的,比如站群服务器的IP分布情况,配置技术难度,以及我们成本是比普通的高,商家选择要靠谱的。我们在选择美国多IP...

BlueHost 周年庆典 - 美国/香港虚拟主机 美国SSD VPS低至月32元

我们对于BlueHost主机商还是比较熟悉的,早年我们还是全民使用虚拟主机的时候,大部分的外贸主机都会用到BlueHost无限虚拟主机方案,那时候他们商家只有一款虚拟主机方案。目前,商家国际款和国内款是有差异营销的,BlueHost国内有提供香港、美国、印度和欧洲机房。包括有提供虚拟主机、VPS和独立服务器。现在,BlueHost 商家周年活动,全场五折优惠。我们看看这次的活动有哪些值得选择的。 ...

ReadyDedis:VPS全场5折,1G内存套餐月付2美元起,8个机房可选_服务器安装svn

ReadyDedis是一家2018年成立的国外VPS商家,由印度人开设,主要提供VPS和独立服务器租用等,可选数据中心包括美国洛杉矶、西雅图、亚特兰大、纽约、拉斯维加斯、杰克逊维尔、印度和德国等。目前,商家针对全部VPS主机提供新年5折优惠码,优惠后最低套餐1GB内存每月仅需2美元起,所有VPS均为1Gbps端口不限流量方式。下面列出几款主机配置信息。CPU:1core内存:1GB硬盘:25GB ...

c xml为你推荐
万维读者网《读者》要订购有网站吗?邮箱怎么写工作邮箱怎么填bluestacks安卓模拟器BlueStacks如何安装使用?创维云电视功能什么是创维云电视啊?创维云电视是什么意思?mate8价格华为mate8市场价多少bt封杀为什么现在网上许多BT下载都被封了?cr2格式如何打开CR2格式的照片呢如何清理ie缓存怎么清理IE缓存网站地图制作如何制作、提交网站地图聚美优品红包聚美优品里怎么合并红包
谷歌域名邮箱 希网动态域名 樊云 namecheap unsplash tk域名 息壤代理 爱奇艺vip免费领取 群英网络 阿里云个人邮箱 netvigator 博客域名 香港ip 沈阳idc 月付空间 连连支付 德国代理 文件传输 neicun 赵蓉 更多