BOOL FindMarkItem(CMarkup& markDoc, ST_MARKITEM& kvOut) { while(markDoc.FindElem()) { //tree node, set val to empty kvOut.strVal.Empty(); kvOut.bIsPath = TRUE; ST_MARKITEM tmpItem; CString strAttKey; CString strAttVal; int nAttIdx = 0; while(markDoc.GetNthAttrib(nAttIdx, strAttKey, strAttVal)) { tmpItem.mapAttrib[strAttKey] = strAttVal; ++nAttIdx; } tmpItem.strKey = markDoc.GetTagName(); tmpItem.strVal = markDoc.GetElemContent(); markDoc.IntoElem(); FindMarkItem(markDoc, tmpItem); markDoc.OutOfElem(); kvOut.mapChildItem[tmpItem.strKey] = tmpItem; } return TRUE; }
/** 调用此函数前需保证xml中已经通过FindElem()定位到当前元素。 */ void CXmlElement::Load(CMarkup& xml) { _name = xml.GetTagName(); CString attrib_name, attrib_value; int i = 0; while(xml.GetNthAttrib(i, attrib_name, attrib_value)) { _attributes.push_back(std::make_pair(attrib_name, attrib_value)); ++i; } _value = xml.GetData(); if (_value.IsEmpty()) { xml.IntoElem(); while (xml.FindElem()) { CXmlElement* element = new CXmlElement; element->Load(xml); _children.push_back(element); } xml.OutOfElem(); } }