现在的位置: 首页 > 综合 > 正文

XML文件的简单初步解析

2013年12月23日 ⁄ 综合 ⁄ 共 3502字 ⁄ 字号 评论关闭
 摘要:通过扫描字符串及结构体数组,实现对XML文件的简单初步解析。

关键字:XML,解析

主要算法:XML文件的实质是字符串,解析XML的工作主要是了解XML的规则,从而对字符串进行分析,解析。从XML文件的开始扫描,连续获得2个标签的位置,转化为字符串,比较firstname和nextname,如果匹配关闭,则把标签名,内容,层次,存放到结构体数组中,继续扫描,如果不匹配,则把firstname压栈,继续扫描,直到firstname和nextname匹配或者与栈顶元素匹配。本题主要是自己设计一种数据结构和一种算法来把解析出来的XML数据信息,合理的存放,从而实现最简单最初步的解析。我是在控制台上实现的,运行后可以把XML的所有结点的标签名,值,以及它位于整个XML文件的层次。具体的请参考源程序,在VC6.0下测试通过(其中的web.xml为程序运行的初始xml文件)。

结构体定义

struct xmlnode
{
    CString name;
//标签名
    CString value;//内容
    int id;//这个标签的层次,通过栈实现
}
;
xmlnode node[
1000];

解析函数:

void str2array(CString context)
{
    CString firstname;
    CString nextname;
    CString tempname;
    CString tempvalue;
    CStringArray stack;
//一个记录标签是否关闭的栈
    stack.Add("");
    
int max=0;
    
int nid=1;
    
int k=0;
    
int i1,i2,j1,j2,k1,k2;
    
while((k<context.GetLength())&&(context[k]!=''<''))//确定各个标签的位置
    {
        k
++;
    }

    i1
=k; 
    
while((k<context.GetLength())&&(context[k]!='' '')&&(context[k]!=''>''))
    
{
        k
++;
    }

    k1
=k;
    
while((k<context.GetLength())&&(context[k]!=''>''))
    
{
        k
++;
    }

    j1
=k;
    firstname
=getcontext(context,i1,k1);//获得第一个标签
    while((k<context.GetLength())&&(context[k]!=''<''))//确定各个标签的位置
    {
        k
++;
    }

    i2
=k;
    
while((k<context.GetLength())&&(context[k]!='' '')&&(context[k]!=''>''))
    
{
        k
++;
    }

    k2
=k;
    
while((k<context.GetLength())&&(context[k]!=''>''))
    
{
        k
++;
    }

    j2
=k;
    nextname
=getcontext(context,i2,k2);//获得第二个标签
    tempname=''/''+firstname;
    
while(k<context.GetLength())
    
{
        
if(tempname.Compare(nextname)==0)//该标签关闭
        {
            node[count].name
=firstname;
            tempvalue
=getcontext(context,j1,i2);
            tempvalue.TrimLeft();
            tempvalue.TrimRight();
            node[count].value
=tempvalue;
            node[count].id
=nid;
            count
++;
            
do
            
{
                
while((k<context.GetLength())&&(context[k]!=''<''))//获得下一个标签
                {
                    k
++;
                }

                i2
=k;
                
while((k<context.GetLength())&&(context[k]!='' '')&&(context[k]!=''>''))
                
{
                    k
++;
                }

                k2
=k;
                
while((k<context.GetLength())&&(context[k]!=''>''))
                
{
                    k
++;
                }

                j2
=k;
                nextname
=getcontext(context,i2,k2);
                
if(nextname.Compare(stack.GetAt(max))==0)
                
{
                    stack.RemoveAt(max);
                    nid
--;
                    max
--;
                }

            }
while((nextname.GetLength()>0)&&(nextname[0]==''/''));
            
//same
        }

        
else//标签没有关闭,压栈
        {
            tempname
=''/''+firstname;
            max
++;
            stack.Add(tempname);
            node[count].name
=firstname;
            node[count].value
="";
            node[count].id
=nid;
            count
++;
            nid
++;
            
//different
        }

        firstname
=nextname;
        i1
=i2;
        k1
=k2;
        j1
=j2;
        
while((k<context.GetLength())&&(context[k]!=''<''))//获得下一个标签
        {
            k
++;
        }

        i2
=k;
        
while((k<context.GetLength())&&(context[k]!='' '')&&(context[k]!=''>''))
        
{
            k
++;
        }

        k2
=k;
        
while((k<context.GetLength())&&(context[k]!=''>''))
        
{
            k
++;
        }

        j2
=k;
        nextname
=getcontext(context,i2,k2);
        tempname
=''/''+firstname;
    }

}

本程序对XML开始的说明部分不能解析,对注释也不能解析,只能达到一个最基本的解析。

抱歉!评论已关闭.