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

            最新評論

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

             

            /*
            *XMLFile.h
            */

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


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            精品国产热久久久福利| 久久久av波多野一区二区| 色成年激情久久综合| 国产农村妇女毛片精品久久| 久久精品国产99久久丝袜| 尹人香蕉久久99天天拍| 色婷婷综合久久久久中文| 99久久久精品免费观看国产| 国产精品免费久久| 久久国产乱子伦精品免费强| 久久久久久久免费视频| 国产精品久久久久久福利69堂| 国产精品一区二区久久精品无码| 精品久久久久久综合日本| a级成人毛片久久| 日本福利片国产午夜久久| 国产精品九九久久免费视频 | 无码精品久久久久久人妻中字| 国产成人精品久久二区二区| 久久久久99精品成人片试看| 久久99精品国产自在现线小黄鸭 | 人人狠狠综合久久亚洲| 色综合久久久久无码专区| 久久亚洲精精品中文字幕| 精品久久久久久久无码 | 久久狠狠一本精品综合网| 亚洲国产精品嫩草影院久久| 国产69精品久久久久观看软件| 国产激情久久久久影院老熟女免费 | 精品久久人妻av中文字幕| 久久99精品国产99久久6男男| 国产精品成人99久久久久91gav| 精品久久久久久无码免费| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久亚洲精品无码aⅴ大香| 亚洲AV日韩精品久久久久| 欧美精品一本久久男人的天堂| 国产亚州精品女人久久久久久 | 久久99热精品| 国产精品美女久久久| 九九热久久免费视频|