欢迎来到天天文库
浏览记录
ID:27544922
大小:106.50 KB
页数:5页
时间:2018-12-03
《xml算法流程设计》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、1xml文本解析成xml节点链表的详细逻辑流程文档2写代码实现对一段xml文本的解析设计0的:实现一个读取xml文件的信息存入数据结构以及如何将结构体中的数据还原成一个xml文件的这样一个解析器。设计题目:xml解析器算法的出栈基木思路:如果该元素是一个空元素,则形如〈elementtype=”name”/〉,只要找到了”/〉”就可以将加入栈顶点的元素提取出来;还有一种情况是非空元素,则形如〈nametype=”name”>如果找到的是“〈/”,就将其后面的标签名与刚压栈的节点标签匹配,如果匹配成功,那么栈
2、顶节点就可以出栈了。基于这个原理就可以很好的区分它们之间的层次关系了。算法的详细流程:1.首先准备一个xml文件,然后将xml文件载入内存(可以定义一个buf用文件读写的方式将xml的完整内容存入到这个buf当中,当然该buf不能太小,否则会溢出),这时xml文件的内容已经全部读取到buf中了,这吋只需要对该buf进行操作。//这个过程可以用open函数来打开文件,通过read函数将xml文件里而的内容全部读取到buf中,在buf最后面加’ ’表示字符串结束2.判断文件是否结束(可以根据’ ’来判断是否结束),如果结
3、束,再判断栈是否为空(为空正常结束,不为空就异常结束)//通过一个char类型的指针来接收这块buf,如char*str=buf;3.如果buf没有到最末位置,接着就判断有效字符是否是’〈’(如果不是的话,程序就直接异常结束,因为xml第一个字符必须是’〈’,这就是所谓的有效字符,不满足该条件就不符合xml文档的格式要求)4.如果该字符是有效字符’<’,继续向后执行5.判断标志类型1.如果标志类型是版本标志”
4、,就异常结束(因为这不是一个语法正确地xml文档)2.如果标志类型是节点标志”’(这个应该是一个空元素的表示方法),顶点出栈)(出栈的原因是该元素己经被完全解析出来了,顶点中的内容就是
5、所需要的内容,应该出栈了)5.如果没有找到结束标志”/〉”,接着判断是否有节点值,如果有节点值的话,就提取该节点值,然后跳到第2步继续重复上面的操作,直到解析完该buf为止。如果没有节点值也跳到第2步继续执行。6.如果结束标志是”〈/”,就取结束标签名,判断该标签名与栈顶节点是否匹配(如果匹配成功,顶点出栈,如果没有匹配成功,则跳到第4步继续执行)while(*str){if(*str二’〈’){//判断是否是冇效字符if(*(str+l)==’/’){//判断是不是结束标志//取结束标签名,并将其保存到所定义的name
6、数组中charname[50]={0};sscanf(str,%*[]%[〉]”,name);//将该标签名与栈顶节点匹配,看是否是同一个节点if(strcmp(peak()-〉m_element,name)==0){//peak()可以获取栈顶点的元素pop();//如果匹配成功,直接将栈顶元素弹出//将str移动到strlen(name)+3,即移动到’〉’}else{//什么也不做}}else{//节点标志//取该节点的标签名sscanf(str,”<%s”,a);//用该函数来读取标签名,并保存在定义好的ei
7、数组中//将考到a中的内容复制到xmlNode结构体中strcpy(xmlNode->m_element,a);push(xmlNode);//将该节点压入拽中//将str指针的位置向后移动strlen(a)+2个字节,继续向下走str=str+strlen(a)+l;//加1而不是加2while(*str!=’〉’){if(*str二’’){//判断是否有属性???//取属性名和值???str++;//将读取到的属性名和值保存在xmlNode结构体的sscanf(str,’’%[/〉]’’,xmlNode-〉m_att
8、ributes);//将str向后移动strlen(xmlNodc->m_attributcs)str=str+strlen(xmlNode-〉m_attributes);}}if(*str二’){//表示节点没冇属性str—;//这步很关键if(strncmp(str,”/〉”,2)==0){//结束标志popO7
此文档下载收益归作者所有