Element.cpp
上传用户:hysujiao87
上传日期:2007-12-02
资源大小:156k
文件大小:3k
源码类别:

ICQ/即时通讯

开发平台:

C/C++

  1. // Element.cpp: implementation of the CElement class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Element.h"
  6. //////////////////////////////////////////////////////////////////////
  7. // Construction/Destruction
  8. //////////////////////////////////////////////////////////////////////
  9. CElement::CElement(CElement* parent) :
  10. m_parent(NULL)
  11. {
  12. if (parent)
  13. {
  14. parent->m_children.AddTail(this);
  15. m_parent = parent;
  16. m_level = parent->m_level + 1;
  17. }
  18. else
  19. {
  20. m_level = 0;
  21. }
  22. }
  23. CElement::~CElement()
  24. {
  25. Free();
  26. }
  27. void CElement::Free()
  28. {
  29. while(m_children.GetCount() > 0)
  30. delete m_children.RemoveTail();
  31. }
  32. int CElement::Enumerate(LPENUM_CALLBACK_FUNC pFunc)
  33. {
  34. if (pFunc == NULL)
  35. return 0;
  36. int ret = 0;
  37. if ( (ret = (*pFunc)(this)) != 0)
  38. return ret;
  39. POSITION pos = m_children.GetHeadPosition();
  40. while(pos != NULL)
  41. {
  42. if ((ret = m_children.GetNext(pos)->Enumerate(pFunc)) != 0)
  43. return ret;
  44. }
  45. return 0;
  46. }
  47. int CElement::BuildElement(CString& xml)
  48. {
  49. int ret = 0;
  50. CString indent;
  51. for(int i = 0; i < m_level; i++)
  52. {
  53. indent += "t";
  54. }
  55. CString begin_tag = indent + "<" + m_tag + ">rn";
  56. xml += begin_tag;
  57. if (!m_content.IsEmpty())
  58. xml = xml + indent + "t" + m_content + "rn";
  59. POSITION pos = m_children.GetHeadPosition();
  60. while(pos != NULL)
  61. {
  62. CElement* child = m_children.GetNext(pos);
  63. _ASSERTE(child != NULL);
  64. if (!child)
  65. return -1;
  66. if ( (ret = child->BuildElement(xml)) != 0)
  67. return ret;
  68. }
  69. CString finish_tag = indent + "</" + m_tag + ">rn";
  70. xml += finish_tag;
  71. return 0;
  72. }
  73. int CElement::AddChild(CString tag, CString content)
  74. {
  75. CElement* child = new CElement(this);
  76. if (child == NULL)
  77. return -1;
  78. child->set_tag(tag);
  79. child->set_content(content);
  80. return 0;
  81. }
  82. HRESULT CElement::GetChildrenByTag(LPCTSTR tag, CElementList &list)
  83. {
  84. list.RemoveAll();
  85. POSITION pos = m_children.GetHeadPosition();
  86. while(pos != NULL)
  87. {
  88. CElement* child = m_children.GetNext(pos);
  89. _ASSERTE(child != NULL);
  90. if (!child)
  91. return E_UNEXPECTED;
  92. // NOTIFY: don't release child out by this list.
  93. if (tag != NULL)
  94. {
  95. if (child->get_tag() == tag)
  96. list.AddTail(child);
  97. }
  98. else
  99. list.AddTail(child);
  100. }
  101. return S_OK;
  102. }
  103. CElement* CElement::GetFirstChildByTag(LPCTSTR tag)
  104. {
  105. POSITION pos = m_children.GetHeadPosition();
  106. while(pos != NULL)
  107. {
  108. CElement* child = m_children.GetNext(pos);
  109. _ASSERTE(child != NULL);
  110. if (!child)
  111. return NULL;
  112. // NOTIFY: don't release child out by this list.
  113. if (tag != NULL)
  114. {
  115. if (child->get_tag() == tag)
  116. return child;
  117. }
  118. else
  119. return child;
  120. }
  121. return NULL;
  122. }