在arm嵌入式linux下解析XML文件(转)

来源:互联网 发布:圆通快递淘宝价格表 编辑:程序博客网 时间:2024/06/05 07:52

在arm嵌入式linux下解析XML文件(转)


来源: ChinaUnix博客  日期: 2009.09.01 14:03 (共有0条评论) 我要评论

最近在arm-linux下做个项目,需要在本地记录一些数据,日志之类的东西.本来准备随便用文本文件记录下完事,突然看到了rss,于是想起了xml.自己还没有用过xml,于是打算用xml来存放这个写数据,算是练个手.
由于以前没有了解过xml编程,所以查阅了点资料.原来目前的xml解析器一般有两种解析的形式.一种是DOM模型的,一种是SAX2模型的.DOM模型是讲xml文件中的结构解析成一棵树,然后再进行各种操作;而SAX2模型是类似与事件处理的方式从头到位解析xml文件.两种方式各有优劣,不过在嵌入式设备上用DOM模型的解析器似乎太耗内存,所以一般都用SAX2的解析器.而我使用的正是linux下的expat,是符合SAX2模型的.
好像linux都有自带expat的库,不过我为了移植到arm板上还是去下了个源码包.先交叉编译通过确认可以使用了才开始学习具体的使用.在源码包中有一个帮助文件已经很详细的介绍了库中每个函数的用途和入门编程.基本上看这个就够用了.
查阅了帮助发现其实只需要3,4个函数就可以搞定大部分的工作.
XML_Parser XML_ParserCreate(const XML_Char *encoding);建立一个XML的对象.
XML_SetElementHandler(XML_Parser p, XML_StartElementHandler start, XML_EndElementHandler end);
是设置处理元素头尾的函数.
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+=2) { printf("%s=%s",attr,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程序的框架都是这个样子,稍作改动就可以用在自己的程序里.

本文来自CSDN博客,转载请标明出处:
http://blog.csdn.net/ifq/archive/2006/08/19/1096900.aspx