• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            游戲編程

            常用鏈接

            統(tǒng)計(jì)

            最新評論

            自己花了一個(gè)通宵寫的XML讀寫類

             

            /*
            *XMLFile.h
            */

            #ifndef XMLFILE_H_H
            #define XMLFILE_H_H
            /*
            * 實(shí)現(xiàn)類似xml的簡單文件存儲格式
            * 處理的文件必須格式完全正確

            */


            #include 
            <fstream>
            #include 
            <string>


            using namespace std;


            class CXMLFileAttribute
            {
            public:
                
            string mName;
                
            string mValue;
                CXMLFileAttribute
            *    mNextAttribute;


            public:
                CXMLFileAttribute()
            {mNextAttribute = NULL;}
                CXMLFileAttribute
            * GetNextAttri(){return mNextAttribute;}
                
            //解析
                char* GetNameInfoFromChars(char* p);
                
            char* GetValueInfoFromChars(char* p);
                
            char* GetAttriInfoFromChars(char* p);
                
            //取值
                void    SaveFile(ofstream *file);
            }
            ;

            class CXMLFileNode
            {
            public:
                CXMLFileNode
            *        mParent;
                CXMLFileNode
            *        mFirstChild;
                CXMLFileNode
            *        mNextSibling;
                
            string                mValue;
                
            string                mSign;
                CXMLFileAttribute
            *    mAttribute;


            public:
                
            char* GetValue();
                
            char* GetName();
                CXMLFileNode();
                CXMLFileNode
            * GetNextSibling(){return mNextSibling;}
                CXMLFileNode
            * GetLastChild();
                CXMLFileAttribute
            * GetLastAttri();

                
            //解析
                char* GetSignFromChars(char* p);
                
            char* GetValueFromChars(char* p);
                
            char* GetAttriFromChars(char* p);
                
            char* GetNodeInfoFromChars(char* p);
                
            char* GetChildrenInfoFromChars(char* p);
                
            //~解析
                void    SaveFile(ofstream *file ,int depth);
            }
            ;



            class CXMLFile
            {
            public:
                CXMLFileNode
            *    mRootNode;
                
            char*            mData;
            public:

                
            void ReadFile(char* filename);
                
            void SaveFile(char* filename);
            }
            ;

            #endif


            /*
            *XMLFile.cpp
            */

            #include 
            "XMLFile.h"

            char* SkipWhiteSpace(char* p)
            {
                
            if ( !|| !*p )
                    
            return 0;
                
            while ( *&& *== ' '|| *== '\n' || *=='\r' || *=='\t' || *p<0 )
                        
            ++p;
                
            while(!*p)
                    
            ++p;
                
            return p;
            }


            char* CXMLFileAttribute::GetNameInfoFromChars(char* p)
            {
                p 
            = SkipWhiteSpace( p );
                
            if ( !|| !*p ) 
                    
            return 0;
                
            while (p && *&& *p!= '=')
                
            {
                    mName.push_back( 
            *p);
                    p
            ++;
                }

                
            return p;
            }


            char* CXMLFileAttribute::GetValueInfoFromChars(char* p)
            {
                p 
            = SkipWhiteSpace( p);
                
            if ( !|| !*p ) 
                    
            return 0;
                p
            ++//跳過 =
                p++;//跳過 “
                while (p && *&& *p!='"')
                
            {
                    mValue.push_back( 
            *p);
                    p
            ++;
                }

                p
            ++//跳過 ”
                return p;
            }


            char* CXMLFileAttribute::GetAttriInfoFromChars(char* p)
            {
                p 
            = SkipWhiteSpace( p);
                
            if ( !|| !*p ) 
                    
            return 0;
                p 
            = GetNameInfoFromChars(p);
                p 
            = GetValueInfoFromChars(p);
                
            return p;
            }


            void CXMLFileAttribute::SaveFile(ofstream* file)
            {
                
            *file<<mName<< "="<< "\""<<mValue<<"\"";
            }


            //CXMLFileNode

            CXMLFileNode::CXMLFileNode()
            {
                mSign.clear();
                mValue.clear();
                mParent 
            = NULL;
                mAttribute 
            = NULL;
                mFirstChild 
            = NULL;
                mNextSibling 
            = NULL;
            }


            CXMLFileNode
            * CXMLFileNode::GetLastChild()
            {
                CXMLFileNode
            * node = mFirstChild;
                
            while(node && node->GetNextSibling())
                    node 
            = node->GetNextSibling(); 
                
            return node;
            }


            char* CXMLFileNode::GetSignFromChars(char* p)
            {
                p 
            = SkipWhiteSpace( p);
                p
            ++;//越過‘<’
                if ( !|| !*p ) 
                    
            return 0;
                
            while (p && *&& *p!='>' && *!= ' ' )
                
            {
                    mSign.push_back( 
            *p);
                    p
            ++;
                }

                
            return p;
            }


            char* CXMLFileNode::GetValueFromChars(char* p)
            {
                p 
            = SkipWhiteSpace( p);
                
            if ( !|| !*p ) 
                    
            return 0;
                p
            ++//跳過 >
                if ( !|| !*p )
                    
            return 0;
                p 
            = SkipWhiteSpace( p);
                
            while (p && *&& *p!='<')
                
            {
                    mValue.push_back( 
            *p );
                    p
            ++;
                }

                
            return p;
            }


            char* CXMLFileNode::GetAttriFromChars(char* p)
            {
                p 
            = SkipWhiteSpace( p);
                    
            if ( !|| !*p ) 
                        
            return 0;
                
            if(*== '>' )
                    
            return p;
                CXMLFileAttribute
            * attri;
                
            while(*!='>')
                
            {
                    
            if(!mAttribute)
                    
            {
                        mAttribute 
            = new CXMLFileAttribute();
                        p 
            = mAttribute->GetAttriInfoFromChars(p);
                    }

                    
            else
                    
            {
                        attri 
            =mAttribute;
                        
            while(attri && attri->GetNextAttri())
                            attri 
            = attri->GetNextAttri();
                        attri
            ->mNextAttribute = new CXMLFileAttribute();
                        p 
            = attri->mNextAttribute->GetAttriInfoFromChars(p);
                    }

                    
                    p 
            = SkipWhiteSpace( p);
                    
            if ( !|| !*p ) 
                        
            return 0;
                }

                
            return p;
            }

            char* CXMLFileNode::GetNodeInfoFromChars(char* p)
            {
                p 
            = GetSignFromChars(p);
                p 
            = GetAttriFromChars(p);
                p 
            = GetValueFromChars(p);
                p 
            = SkipWhiteSpace( p);
                
            if ( !|| !*p ) 
                    
            return 0;
                
            char* p1 = p;
                CXMLFileNode
            * node = this;
                
            if(*p1 == '<' && *(++p1) == '/' )
                
            {
                    
            while(*== '<' && *p1 == '/' )
                    
            {
                        
            while(*!= '>')
                            p
            ++;
                        p 
            = SkipWhiteSpace(p);
                        p
            ++;//越過>
                        p =SkipWhiteSpace(p);
                        
                        
            if ( !|| !*p ) 
                            
            return 0;
                        node 
            = node->mParent;
                        p1 
            = p + 1;
                    }

                    CXMLFileNode
            * nodeBrothor = node;
                    node 
            = node->mFirstChild;
                    
            while(node && node->mNextSibling)
                        node 
            = node->mNextSibling;
                    p 
            = SkipWhiteSpace(p);
                    
            if ( !|| !*p ) 
                        
            return 0;
                    node
            ->mNextSibling = new CXMLFileNode();
                    node
            ->mNextSibling->mParent = nodeBrothor;
                    
            return node->mNextSibling->GetNodeInfoFromChars(p);
                }

                
            else
                
            {
                    
            while(*!= '<')
                        p
            ++;
                    p 
            = GetChildrenInfoFromChars(p);
                }

                
            return p;
            }


            char* CXMLFileNode::GetChildrenInfoFromChars(char* p)
            {
                mFirstChild 
            = new CXMLFileNode();
                mFirstChild
            ->mParent = this;
                
            return mFirstChild->GetNodeInfoFromChars(p);
            }


            void CXMLFileNode::SaveFile(ofstream* file ,int depth)
            {
                
            int i;
                
            for ( i=0; i<depth; i++ ) 
                    
            *file<<"    ";

                
            *file<<"<"<<mSign.c_str();

                CXMLFileAttribute
            * attrib;
                
            for ( attrib = mAttribute; attrib; attrib = attrib->GetNextAttri())
                
            {
                    
            *file<< " ";
                    attrib
            ->SaveFile( file);
                }


                
            *file<< ">";
                
            *file<<mValue.c_str();
                
            if(mFirstChild)        
                    
            *file<< "\n";

                
            for ( CXMLFileNode* chileNnode = mFirstChild; chileNnode; chileNnode=chileNnode->mNextSibling)
                
            {
                    chileNnode
            ->SaveFile(file, depth+1 );
                    
            if(chileNnode->mNextSibling)
                        
            *file<<"\n";
                }



                
            if(mFirstChild)
                
            {
                    
            *file<<"\n";
                    
            for( i=0; i<depth; ++i ) 
                        
            *file<<"    ";
                    
            *file<< "</"<<mSign.c_str()<< ">";
                }

                
            else
                
            {
                    
            *file<< "</"<<mSign.c_str()<< ">";
                }

                
            }


            //CXMLFile

            void CXMLFile::ReadFile(char* filename)
            {
                ifstream file(filename,ifstream::binary);
                
            long length = 0;

                length 
            = file.tellg();
                
                file.seekg(
            0,ios::end);
                length 
            = file.tellg();

                
            if ( length <= 0 )
                    
            return;
                mData 
            = new char[ length+1 ];
                file.seekg( 
            0, ios::beg );
                file.read( mData, length);
                mData[length] 
            = 0;
                mRootNode 
            = new CXMLFileNode();
                mRootNode
            ->GetNodeInfoFromChars(mData);
            }


            void CXMLFile::SaveFile(char* filename)
            {
                ofstream file(filename);
                mRootNode
            ->SaveFile( &file, 0 );
            }

            posted on 2009-03-02 06:52 Arcadia-er 閱讀(247) 評論(0)  編輯 收藏 引用

            国内精品久久久久久久久电影网| 国产成人精品久久亚洲高清不卡 | 久久香综合精品久久伊人| 亚洲国产高清精品线久久| 午夜视频久久久久一区| 久久99九九国产免费看小说| 久久久国产精华液| 久久无码人妻一区二区三区午夜| 99久久精品日本一区二区免费| 国产精品免费看久久久香蕉| 久久综合日本熟妇| 久久香综合精品久久伊人| 国产精品成人久久久久久久| 亚洲国产日韩欧美久久| 久久精品人人槡人妻人人玩AV| 中文字幕一区二区三区久久网站 | 精品久久人人做人人爽综合| 亚洲伊人久久综合中文成人网| 久久国产色AV免费观看| 久久综合九色综合欧美就去吻| 久久亚洲AV成人无码电影| 青青草原综合久久大伊人导航| 国产Av激情久久无码天堂| 欧美日韩成人精品久久久免费看| 久久久久亚洲Av无码专| 亚洲国产成人久久精品99| 久久精品国产一区二区三区日韩| 老男人久久青草av高清| 成人亚洲欧美久久久久| 亚洲精品乱码久久久久久自慰| 国产福利电影一区二区三区久久老子无码午夜伦不 | 亚洲国产香蕉人人爽成AV片久久 | 精品水蜜桃久久久久久久| 久久久久久午夜成人影院 | 国产精品久久久久久久久| 精品久久久一二三区| 亚洲国产精品久久66| 精品久久久久久久久午夜福利| 国内精品伊人久久久久妇| 99久久99久久精品国产片| 久久99精品久久久久久动态图|