xml算法流程设计.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
xml算法流程设计

1 xml文本解析成xml节点链表的详细逻辑流程文档 2 写代码实现对一段xml文本的解析 设计目的:实现一个读取xml文件的信息存入数据结构以及如何将结构体中的数据还原成一个xml文件的这样一个解析器。 设计题目:xml解析器 算法的出栈基本思路:如果该元素是一个空元素, 则形如element type=”name”/,只要找到了”/”就可以将加入栈顶点的元素提取出来;还有一种情况是非空元素,则形如name type=”name”/name 如果找到的是“/”,就将其后面的标签名与刚压栈的节点标签匹配,如果匹配成功,那么栈顶节点就可以出栈了。 基于这个原理就可以很好的区分它们之间的层次关系了。 算法的详细流程: 首先准备一个xml文件,然后将xml文件载入内存(可以定义一个buf用文件读写的方式将xml的完整内容存入到这个buf当中,当然该buf不能太小,否则会溢出),这时xml文件的内容已经全部读取到buf中了,这时只需要对该buf进行操作。 //这个过程可以用open函数来打开文件,通过read函数将xml文件里面的内容全部读取到buf中,在buf最后面加’\0’表示字符串结束 判断文件是否结束(可以根据’\0’来判断是否结束),如果结束,再判断栈是否为空(为空正常结束,不为空就异常结束) //通过一个char类型的指针来接收这块buf,如char* str=buf; 如果buf没有到最末位置,接着就判断有效字符是否是’’(如果不是的话,程序就直接异常结束,因为xml第一个字符必须是’’,这就是所谓的有效字符,不满足该条件就不符合xml文档的格式要求) 如果该字符是有效字符’’,继续向后执行 判断标志类型 如果标志类型是版本标志”?xml”,再查找版本结束标志”?”,如果找到了就定位成功,则跳到第3步继续向后进行操作,如果没找到定位不成功,就异常结束(因为这不是一个语法正确地xml文档) 如果标志类型是节点标志”XXX”,提取该标签名(标签名和属性之间有空格,可以用空格作为读取标签的结束标志),并将该标签名加如栈顶点的孩子链表,并入栈 再判断该标签是否有属性(如果有的话,就提取属性名和对应的值,将属性节点加入孩子链表中),然后继续判断该标签是否还有元素(一个标签中可能有多个元素) 如果没有属性值的话,判断是否有结束标志(如果找到了结束标志’/’(这个应该是一个空元素的表示方法),顶点出栈)(出栈的原因是该元素已经被完全解析出来了,顶点中的内容就是所需要的内容,应该出栈了) 如果没有找到结束标志”/”,接着判断是否有节点值,如果有节点值的话,就提取该节点值,然后跳到第2步继续重复上面的操作,直到解析完该buf为止。如果没有节点值也跳到第2步继续执行。 如果结束标志是”/”,就取结束标签名, 判断该标签名与栈顶节点是否匹配(如果匹配成功,顶点出栈,如果没有匹配成功,则跳到第4步继续执行) while(*str){ if(*str ==’’){//判断是否是有效字符 if(*(str+1)==’/’){//判断是不是结束标志 //取结束标签名,并将其保存到所定义的name数组中 char name[50]={0}; sscanf(str,”%*[/]%[^]”,name); //将该标签名与栈顶节点匹配,看是否是同一个节点 if(strcmp(peak()-m_element,name)==0){//peak()可以获取栈顶点的元素 pop();//如果匹配成功,直接将栈顶元素弹出 //将str移动到strlen(name)+3,即移动到’’ } else{ //什么也不做 } } else{//节点标志 //取该节点的标签名 sscanf(str,”%s”,a);//用该函数来读取标签名,并保存在定义好的a数组中 //将考到a中的内容复制到xmlNode结构体中 strcpy(xmlNode-m_element,a); push(xmlNode);//将该节点压入栈中 //将str指针的位置向后移动strlen(a)+2个字节,继续向下走 str = str + strlen(a)+1;//加1而不是加2 while(*str!=’’){ if(*str == ’’){//判断是否有属性??? //取属性名和值??? str++; //将读取到的属性名和值保存在xmlNode结构体的sscanf(str,”%[^/]”,xmlNode-m_attributes); //将str向后移动strle

文档评论(0)

haihang2017 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档