- 1、本文档共5页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
您可能关注的文档
- UnixLinux下的管道通信机制及管道通信程序示例.doc
- Unit_16_Scientists_at_Work教学设计.doc
- Unit1同步评估2.doc
- Unity3D经典入门教程(精).docx
- USB接口芯片CY7C68013自动固件驱动程序的配置.doc
- vb程序设计章节作业.doc
- TTA使用手册.doc
- VB程序设计选择结构.doc
- TR7100入门手册.doc
- VirtuoZo教育网络版许可使用方法.doc
- 2021-2022学年湖南省常德市安乡县四年级上学期期中语文真题及答案.pdf
- 2023-2024学年河南省南阳市社旗县四年级上学期期中数学真题及答案.pdf
- 2022-2023学年云南省曲靖市四年级下学期期末数学真题及答案.pdf
- 2021-2022学年河南省周口市鹿邑县二年级下册月考语文真题及答案.pdf
- 2018年河南焦作解放区教师招聘考试真题及答案.pdf
- 2019年江西公务员行测考试真题及答案-乡镇.pdf
- 2019中国石油报社应届高校毕业生招聘试题及答案解析.pdf
- 光大银行招聘应届毕业生能力素质测试笔试真题及答案.pdf
- 2024年广西百色教师招聘考试模拟题及答案.pdf
- 2021-2022学年浙江绍兴诸暨市五年级上册语文期末试卷及答案.pdf
文档评论(0)