是设置处理元素头尾的函数.
XML_SetCharacterDataHandler(XML_Parser p,XML_CharacterDataHandler charhndl)
设置元素内文本的处理函数.void XML_SetUserData(XML_Parser p,void *userData);
设置一个共享的数据结构给各各处理函数使用.XML_Status XML_Parse(XML_Parser p,const char *s,int len,int isFinal);
这个是主处理函数.通过给XML_Parse对象指定一个含有xml文本的char型数组s,来解析xml.解析的过程就是在读到某个位置就调用的处理函数来处理.比如读到元素的头部,就调用在XML_SetElementHandler中设定的start函数来处理.
上面描述的有些空洞,看个例子就全明白了:
要解析这样一个XML:
a greate guy!
显示其中的attr和content,程序如下:
void starthandle(void *userdata, const char *el, const char **attr)
{
//解析时对xml元素头的解析函数
int i;
for (i=0;attr[i];i+=2)
{
printf("%s=%s",attr[i],attr[i+1]);
}
}
void endhandle(void *data, const char *el)
{
//什么也不做.
}
void chardatahandle(void *data,char *s,int len)
{
//显示content的内容.注意s不是以空作为字符串结尾的标识.要手动用len来控制.
}
int ReadXml(char *xmlbuf,int bufsize)
{
XML_Parser g_Parser=XML_ParserCreate(NULL);
XML_SetElementHandler(g_Parser, starthandle,endhandle);
XML_SetCharacterDataHandler(g_Parse,chardatahandle);
if (! XML_Parse(g_Parser, xmlbuf, bufsize, 1))
{
fprintf(stderr, "Parse error at line %d:/n%s/n",
XML_GetCurrentLineNumber(g_Parser),
XML_ErrorString(XML_GetErrorCode(g_Parser)));
return -1;
}
XML_ParserFree(g_Parser);return 0;
}//程序大概就是这样,但是没有调试,不能保证正确:)
上边就是整个处理程序,是要调用readXML,传入xml的buf就可以解析了.基本上所有expat程序的框架都是这个样子,稍作改动就可以用在自己的程序里.
以上就是我对xml解析的一点点总结,能力有限,如果有什么地方有错误,还请大家多多指点.欢迎大家和我交流.我的email:ifqqfi@gmail.com