• <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>

            游戲編程

            常用鏈接

            統計

            最新評論

            自己花了一個通宵寫的XML讀寫類

             

            /*
            *XMLFile.h
            */

            #ifndef XMLFILE_H_H
            #define XMLFILE_H_H
            /*
            * 實現類似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 閱讀(248) 評論(0)  編輯 收藏 引用

            久久久国产亚洲精品| 青草影院天堂男人久久| 伊人久久综在合线亚洲2019| 久久久av波多野一区二区| 久久精品夜夜夜夜夜久久| 久久久久久久女国产乱让韩| 狠狠色丁香久久婷婷综合图片| 欧洲性大片xxxxx久久久| 久久久久亚洲AV综合波多野结衣 | 久久久综合香蕉尹人综合网| 国产成人久久激情91| a级毛片无码兔费真人久久| 久久国产成人午夜AV影院| 久久夜色精品国产噜噜亚洲a | 久久无码人妻一区二区三区 | 精品久久久久久无码人妻热| 99re久久精品国产首页2020| 久久精品www人人爽人人| 国产一级持黄大片99久久| 久久艹国产| 久久久久久国产a免费观看黄色大片| 久久笫一福利免费导航| 亚洲国产欧美国产综合久久| 久久av免费天堂小草播放| 91精品国产高清久久久久久国产嫩草| 99久久精品国产一区二区三区| 精品国产婷婷久久久| 狠狠色噜噜色狠狠狠综合久久| 久久99国产精品久久久| 国产精品狼人久久久久影院| 一本久久免费视频| 99久久人人爽亚洲精品美女| 久久免费香蕉视频| 久久综合九色综合网站| 国产精品亚洲综合专区片高清久久久 | 国产91久久精品一区二区| 国产成人精品久久一区二区三区av| 亚洲精品视频久久久| 久久综合狠狠综合久久综合88| 99久久夜色精品国产网站| 亚洲国产另类久久久精品黑人 |