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

            Codejie's C++ Space

            Using C++

            輪子:用于分析Lingoes結(jié)果的HTML解析對象(二)


                今天才有時間繼續(xù)寫HTML解析對象的查找部分代碼。代碼如下,下次再整理~

                CDocumentObject類,增加了兩類查詢函數(shù),一種用于從根部開始的遍歷性查詢,另一種則是指定Tag范圍內(nèi)查詢。
            class CDocumentObject
            {
            protected:
                static const char TAG_LT        =   '<';
                static const char TAG_GT        =   '>';
                static const char TAG_SLASH     =   '/';
                static const char TAG_BSLASH    =   '\\';
                static const char TAG_AND       =   '&';

                typedef std::vector<CParserData> TDataVector;

                typedef std::stack<CParserData> TDataStack;
                struct TNodeData
                {
                    size_t level;
                    CParserData tag;
                    CParserData value;
            //        CParserData end;
                };
                typedef std::deque<TNodeData> TNodeQueue;
            public:
                typedef std::stack<const CElementObject*> TElementStack;
            public:
                CDocumentObject();
                virtual ~CDocumentObject();

                int Load(const std::string& str);

                const CElementObject* Root() const;

                const CElementObject* FindFirstElement(const std::string& tag);
                const CElementObject* FindNextElement();

                const CElementObject* FindFirstElement(const CElementObject* element, const std::string& tag, TElementStack& tmpstack);
                const CElementObject* FindNextElement(const CElementObject* element, const std::string& tag, TElementStack& tmpstack);

                const CAttributeObject* FindAttribute(const CElementObject* element, const std::string& attr);
                
                void Show(std::ostream& os) const;
            protected:
                int PreProcess(const std::string& str, std::string& html);
                int PreParser(const std::string& html, TNodeQueue& vct);
                int Parser(const std::string& html, TNodeQueue& que);
            private:
                int PreParserLT(const std::string& html, std::string::size_type& pos, CParserData& data);
                int PushValueData(const CParserData& data, TDataStack& datastack) const;
                int PushTagData(const std::string& html, const CParserData& data, TDataStack& datatstack, TNodeQueue& nodeque) const;
                
                int CheckSpecialTag(const std::string& html, const CParserData& data) const;
                int CheckTag(const std::string& html, const CParserData& tag, const CParserData& end) const;
                CElementObject* MakeElement(const std::string& html, const TNodeData& node, CElementObject* parent, CElementObject* sibling) const;

                void CDocumentObject::ShowElement(std::ostream& os, const CElementObject* e) const;

                void FreeElement(CElementObject* root);

                const CElementObject* FindElement(const CElementObject* root, const CElementObject* pe, const std::string& tag, TElementStack& stack);
            private:
                CElementObject* _root;
            private:
                std::string _findtag;
                TElementStack _findstack;
            };

                實現(xiàn)代碼如下:
            const CElementObject* CDocumentObject::FindFirstElement(const std::string &tag)
            {
                
            if(_root == NULL)
                    
            return NULL;

                _findtag 
            = tag;
                
            while(!_findstack.empty())
                    _findstack.pop();
             
                
            return FindElement(NULL, _root, _findtag, _findstack);
            }


            const CElementObject* CDocumentObject::FindNextElement()
            {
                
            if(_findstack.empty())
                    
            return NULL;

                
            return FindElement(NULL, _findstack.top()->child, _findtag, _findstack);
            }


            const CElementObject* CDocumentObject::FindFirstElement(const CElementObject* element, const std::string& tag, TElementStack& tmpstack)
            {
                
            if(element == NULL)
                    
            return NULL;

                
            while(!tmpstack.empty())
                    tmpstack.pop();

                
            return FindElement(element, element, tag, tmpstack);
            }


            const CElementObject* CDocumentObject::FindNextElement(const CElementObject* element, const std::string& tag, TElementStack& tmpstack)
            {
                
            if(tmpstack.empty())
                    
            return NULL;

                
            return FindElement(element, tmpstack.top()->child, tag, tmpstack);
            }


            const CElementObject* CDocumentObject::FindElement(const CElementObject* root, const CElementObject* pe, const std::string& tag, TElementStack& stack)
            {
                
            while(pe != NULL)
                
            {
                    stack.push(pe);
                    
            if(pe->tag == tag)
                        
            return pe;
                    pe 
            = pe->child;
                }

                
                
            while(!stack.empty() && stack.top() != root && pe == NULL)
                
            {
                    pe 
            = stack.top()->sibling;  
                    stack.pop();
                }


                
            if(pe == NULL)
                    
            return NULL;

                
            return FindElement(root, pe, tag, stack);
            }


            const CAttributeObject* CDocumentObject::FindAttribute(const TinyHtmlParser::CElementObject *element, const std::string &attr)
            {
                
            if(element == NULL)
                    
            return NULL;
                
                
            const CAttributeObject* pa = element->attrib;
                
            while(pa != NULL)
                
            {
                    
            if(pa->attr == attr)
                        
            return pa;
                    pa 
            = pa->next;
                }

                
            return pa;
            }


                先不關(guān)心性能和繁瑣性,能寫成這樣已經(jīng)累的我半死了。。。通過寫這個功能,發(fā)現(xiàn)自己對于算法的設(shè)計不能一步到位,實現(xiàn)過程中總是有這樣或哪樣的地方?jīng)]有考慮到,整個對象簡直就是測試出來的。。。還好一條路不通,能馬上換一條,還好敲字快,能馬上再敲一邊。。。

                下面是測試代碼:

                const CElementObject* pe = doc.FindFirstElement("TABLE");
                
                
            while(pe != NULL)
                
            {
                    pe
            ->Show(std::cout);

                    CDocumentObject::TElementStack tmp;

                    
            const CElementObject* p = doc.FindFirstElement(pe, "DIV", tmp);
                    
            while(p != NULL)
                    
            {
                        p
            ->Show(std::cout);
                        p 
            = doc.FindNextElement(pe, "DIV", tmp);
                    }

                    pe 
            = doc.FindNextElement();
                }


            --------------------

            [
            3]Tag : TABLE
                attr : onselectstart 
            -- value = "return true"
                attr : id 
            -- value = dict_head_E1C27E806399D047822B6650194A3D32
                attr : cellSpacing 
            -- value = 0
                attr : cellPadding 
            -- value = 0
                attr : border 
            -- value = 0

            [
            7]Tag : DIV
                attr : onmouseup 
            -- value = "this.className='btn2_mouse_up'"
                attr : 
            class -- value = btn2_mouse_out
                attr : onmousedown 
            -- value = "this.className='btn2_mouse_down'"
                attr : id 
            -- value = dict_title_E1C27E806399D047822B6650194A3D32
                attr : onmouseover 
            -- value = "this.className='btn2_mouse_over'"
                attr : title 
            -- value = "Dictionary Menu"
                attr : style 
            -- value = "MARGIN: 0px 3px 1px 0px"
                attr : onclick 
            -- value = "window.navigate('app://dictmenu/E1C27E806399D047822B6650194A3D32-2')"
                attr : onmouseout -- value = "this.className='btn2_mouse_out'"

            [
            7]Tag : DIV
                attr : style 
            -- value = "OVERFLOW: hidden; WIDTH: 10px; CURSOR: hand; MARGIN-RIGHT: 2px; HEIGHT: 10px"

            posted on 2010-02-22 18:32 codejie 閱讀(273) 評論(0)  編輯 收藏 引用 所屬分類: C++輪子精神

            公告

            Using C++

            導(dǎo)航

            統(tǒng)計

            留言簿(73)

            隨筆分類(513)

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲av日韩精品久久久久久a| 久久亚洲日韩看片无码| 久久久久亚洲AV成人网人人网站 | 久久99久久无码毛片一区二区| 精品国产乱码久久久久久人妻| 一本久久精品一区二区| 亚洲精品视频久久久| 久久人人爽人人爽人人片AV麻烦| 久久精品国产黑森林| 狠狠色丁香婷婷久久综合五月 | 狠狠色狠狠色综合久久 | 精品久久久久久中文字幕大豆网 | 国产美女久久久| 亚洲精品乱码久久久久久不卡| 99久久无码一区人妻a黑| 国产精品va久久久久久久| 久久精品国产乱子伦| 久久精品国产亚洲5555| 91久久精品91久久性色| 欧美喷潮久久久XXXXx| 99久久国产亚洲综合精品| 99热都是精品久久久久久| 久久香蕉一级毛片| 久久成人国产精品| 狠狠色丁香婷婷综合久久来| 久久亚洲春色中文字幕久久久| 久久99九九国产免费看小说| 久久精品国产只有精品66| 久久影视综合亚洲| 久久这里只有精品首页| 久久精品国产亚洲av高清漫画| 亚洲国产精品18久久久久久| 久久99精品久久久久久动态图| 欧美黑人又粗又大久久久| 精品久久久久久中文字幕人妻最新| 中文字幕日本人妻久久久免费| 精品久久久久香蕉网| 亚洲国产精品久久久久网站 | 国产精品福利一区二区久久| 久久99久久99小草精品免视看 | 一本色综合久久|