C语言解析XML中的数据

#include <stdio.h>
#include <string.h>
#include "redmaple.h"   //自定义头文件

struct st       //结构体st
{
        char name[40];
        int age;
        int height;
        double weight;
        char sc[20];
};

ReadXML(char *XMLstr,struct st *std)	//解析XML
{
        char string[50];
        memset(string,0,sizeof(string));
        int i=0,len,t=0;
        while(XMLstr[i]!='\0')			//只要XML没到尾
        {
                if(XMLstr[i]=='>' && XMLstr[i+1]!='<') //获取XML中的数据,一定是中间的数据,而不是两端XML中的空值
                {
                        i++;len=0;
                        while(XMLstr[i]!='<' && XMLstr[i]!='\n')
                        {
                                string[len]=XMLstr[i];
                                len++;i++;
                        }
                        switch(t)
                        {
                                case(0):strcpy(std->name,string);break;
                                case(1):{
                                        int j;
                                        double sum=0;
                                        for(j=0;j<=len-1;j++)
                                        {
                                                sum += (string[j]-48)*POW(10,len-j-1);
                                        }
                                        std->age = (int)sum;
                                        break;
                                        }
                                case(2):{
                                        int j;
                                        double sum=0;
                                        for(j=0;j<=len-1;j++)
                                        {
                                                sum += (string[j]-48)*POW(10,len-j-1);
                                        }
                                        std->height = (int)sum;
                                        break;
                                        }
                                case(3):{
                                        int j=0,dian=0;
                                        double sum=0;
                                        while(string[dian]!='.')
                                        {
                                                dian++;
                                        }
                                        for(j=0;j<dian;j++)
                                        {
                                                sum += (string[j]-48)*POW(10,dian-j-1);
                                        }
                                        for(j=dian+1;j<len;j++)
                                        {
                                                sum += (string[j]-48)*POW(10,dian-j);
                                        }
                                        std->weight = sum;
                                        break;
                                        }
                                case(4):strcpy(std->sc,string);break;
                        }
                        memset(string,0,sizeof(string));
                        t++;
                }
                i++;
        }
}

int main()
{
        FILE *fp;
        if((fp = fopen("supermoder_XML.txt","r"))==0)
        {
                printf("open supermoder_XML.txt failed!\n");
        }
        else
        {
                struct st std;
                char XMLstring[100];
                int i=0;

                for(i=0;i<5;i++)
                {
                        memset(XMLstring,100,sizeof(XMLstring));
                        fgets(XMLstring,100,fp);
                        ReadXML(XMLstring,&std);
                        printf(" name:%12s\n age:%13d\n height:%10d\n weight:%10.2lf\n "\
                   			   "sc:%14s\n\n",std.name,std.age,std.height,std.weight,std.sc);
				}
		}
}

redmaple.c 头文件内容

#include "redmaple.h"
#include <string.h>
#include <stdio.h>

double POW(int x,int y)   //求x的y次幂
{
        if(y>0)
        {
                if(x == 0)
                {
                        return 0;
                }
                else
                {
                        int i;
                        int A = x; 
                        for(i=1;i<y;i++)
                        {
                                A *= x;
                        }
                        return (double)A;
                }
        }
        else if(y<0)
        {
                if(x==0)
                {
                        return 0;
                }
                else
                {
                        int i;
                        int A = x;
                        for(i=1;i<y*(-1);i++)
                        {
                                A *= x;
                        }
                        return 1.0/A;
                }
        }
        else
        {
                return 1;
        }
}

这个READXML只能对特定的结构体进行读取XML数据,不能对任意的结构体进行运作,还有待改善

实验结果

XML编码
在这里插入图片描述
获取编码内的数据,然后存储进结构体内,最后把结构体内的数据都输出出来
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值