• <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結果的HTML解析對象(二)


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

                CDocumentObject類,增加了兩類查詢函數,一種用于從根部開始的遍歷性查詢,另一種則是指定Tag范圍內查詢。
            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;
            };

                實現代碼如下:
            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;
            }


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

                下面是測試代碼:

                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 閱讀(269) 評論(0)  編輯 收藏 引用 所屬分類: C++輪子精神

            公告

            Using C++

            導航

            統計

            留言簿(73)

            隨筆分類(513)

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            久久se这里只有精品| 久久精品国产亚洲AV无码偷窥| 久久精品国产精品青草| 亚洲国产精品久久久久久| 婷婷综合久久中文字幕| 色99久久久久高潮综合影院| 免费久久人人爽人人爽av| 国产亚洲精品自在久久| 精品水蜜桃久久久久久久| 精品久久人人爽天天玩人人妻| 久久超碰97人人做人人爱| 久久男人AV资源网站| 国产精品国色综合久久| 久久综合九色综合欧美就去吻| 久久精品国产精品亚洲毛片 | 亚洲中文字幕久久精品无码喷水| 国产99久久精品一区二区| 久久综合色老色| 久久亚洲国产精品一区二区| 国内精品九九久久精品| 99久久免费只有精品国产| 香蕉久久av一区二区三区| 亚洲国产精品综合久久一线| 色偷偷888欧美精品久久久| 久久精品卫校国产小美女| 久久天天躁狠狠躁夜夜2020老熟妇| 久久综合亚洲欧美成人| 一本色道久久99一综合| 久久久久久久综合狠狠综合| 久久激情五月丁香伊人| 91精品观看91久久久久久| 久久91综合国产91久久精品| 亚洲欧美伊人久久综合一区二区| 亚洲AⅤ优女AV综合久久久| 亚洲v国产v天堂a无码久久| 久久精品一区二区三区中文字幕| 天天久久狠狠色综合| 93精91精品国产综合久久香蕉| 久久99精品久久久久子伦| 国产一级持黄大片99久久| 久久久久四虎国产精品|