class CDocumentObject
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
![](http://www.cppblog.com/Images/dot.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
protected:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
static const char TAG_LT = '<';
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
static const char TAG_GT = '>';
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
static const char TAG_SLASH = '/';
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
static const char TAG_BSLASH = '\\';
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
static const char TAG_AND = '&';
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
typedef std::vector<CParserData> TDataVector;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
typedef std::stack<CParserData> TDataStack;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
struct TNodeData
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cppblog.com/Images/dot.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
size_t level;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
CParserData tag;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
CParserData value;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
// CParserData end;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
};
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
typedef std::deque<TNodeData> TNodeQueue;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
public:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
typedef std::stack<const CElementObject*> TElementStack;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
public:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
CDocumentObject();
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
virtual ~CDocumentObject();
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
int Load(const std::string& str);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
const CElementObject* Root() const;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
const CElementObject* FindFirstElement(const std::string& tag);
const CElementObject* FindNextElement();
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
const CElementObject* FindFirstElement(const CElementObject* element, const std::string& tag, TElementStack& tmpstack);
const CElementObject* FindNextElement(const CElementObject* element, const std::string& tag, TElementStack& tmpstack);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
const CAttributeObject* FindAttribute(const CElementObject* element, const std::string& attr);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
void Show(std::ostream& os) const;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
protected:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
int PreProcess(const std::string& str, std::string& html);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
int PreParser(const std::string& html, TNodeQueue& vct);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
int Parser(const std::string& html, TNodeQueue& que);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
private:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
int PreParserLT(const std::string& html, std::string::size_type& pos, CParserData& data);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
int PushValueData(const CParserData& data, TDataStack& datastack) const;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
int PushTagData(const std::string& html, const CParserData& data, TDataStack& datatstack, TNodeQueue& nodeque) const;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
int CheckSpecialTag(const std::string& html, const CParserData& data) const;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
int CheckTag(const std::string& html, const CParserData& tag, const CParserData& end) const;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
CElementObject* MakeElement(const std::string& html, const TNodeData& node, CElementObject* parent, CElementObject* sibling) const;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
void CDocumentObject::ShowElement(std::ostream& os, const CElementObject* e) const;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
void FreeElement(CElementObject* root);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
const CElementObject* FindElement(const CElementObject* root, const CElementObject* pe, const std::string& tag, TElementStack& stack);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
private:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
CElementObject* _root;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
private:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
std::string _findtag;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
TElementStack _findstack;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
;
先不关心性能和繁琐性,能写成这样已经累的我半死了。。。通过写这个功能,发现自己对于算法的设计不能一步到位,实现过程中总是有这样或哪样的地方没有考虑到,整个对象简直就是测试出来的。。。还好一条路不通,能马上换一条,还好敲字快,能马上再敲一边。。。