免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1556 | 回复: 0
打印 上一主题 下一主题

在arm嵌入式linux下解析XML文件(转) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-01 14:03 |只看该作者 |倒序浏览
最近在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


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/103428/showart_2042994.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP