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

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲午夜精品久久久久久人妖| 精品久久久久一区二区三区| 亚洲成色WWW久久网站| 久久精品人成免费| 国产精品免费久久| 7777精品久久久大香线蕉| 精品国产婷婷久久久| 亚洲乱码精品久久久久..| 国产成人精品久久一区二区三区av | 久久噜噜电影你懂的| 亚洲欧美国产精品专区久久| 精品久久一区二区三区| 久久精品成人欧美大片| 久久国产综合精品五月天| 久久国产亚洲高清观看| 午夜精品久久久久9999高清| 一本大道加勒比久久综合| 久久国语露脸国产精品电影| 久久精品成人免费观看97| 久久国产精品99久久久久久老狼| 国产精品乱码久久久久久软件| 国产91久久综合| jizzjizz国产精品久久| 欧洲精品久久久av无码电影| 亚洲欧美日韩久久精品| 欧美亚洲另类久久综合婷婷| 成人国内精品久久久久影院VR| 国产成人久久精品激情 | 91久久香蕉国产熟女线看| 久久99国产乱子伦精品免费| 伊人久久大香线蕉综合Av| 伊人久久无码精品中文字幕| 久久久久久久综合狠狠综合| 婷婷国产天堂久久综合五月| 久久大香萑太香蕉av| 国产精品久久久久免费a∨| 午夜精品久久久久久影视777| 伊人久久成人成综合网222| 久久AV高潮AV无码AV| 天天躁日日躁狠狠久久| 久久精品蜜芽亚洲国产AV|