void WriteElement() { if (NULL == m_pCurrentNode) { m_pNode = new CXmlNodeBase(); m_pNode->m_pDocument = this; m_pNode->m_pDocument->AddRef(); m_pCurrentNode = m_pNode; } else { // это m_pCurrentNode CXmlNodeBase* pNewBase = new CXmlNodeBase(); pNewBase->m_pDocument = this; pNewBase->m_pDocument->AddRef(); m_pCurrentNode->m_nodes.insert(m_pCurrentNode->m_nodes.end(), pNewBase); m_pCurrentNode = pNewBase; } m_pCurrentNode->m_sName = GetName(); m_list.push_back(m_pCurrentNode); if (GetAttributesCount() > 0) { MoveToFirstAttribute(); CStringA sName = GetNameA(); while (!sName.IsEmpty()) { m_pCurrentNode->m_attributes.insert(std::make_pair(sName, GetTextA())); if ( !MoveToNextAttribute() ) break; sName = GetNameA(); } MoveToElement(); } if (IsEmptyNode()) { m_list.pop_back(); if (0 != m_list.size()) { std::list<CXmlNodeBase*>::iterator iter = m_list.end(); --iter; m_pCurrentNode = *iter; } else { m_pCurrentNode = m_pNode; } } }
bool XmlNodeReader::MoveToNextAttribute() const { if (!m_cur) return false; XmlNode anode = m_cur; if (m_cur.NodeType != XmlNodeType::Attribute) { XmlNode parent = m_cur.ParentNode; if (!parent || parent.NodeType != XmlNodeType::Attribute) return MoveToFirstAttribute(); anode = parent; } XmlAttributeCollection attrs = XmlAttribute(anode).OwnerElement.Attributes; for (int i=0, count=attrs.Count; i<count-1; ++i) { XmlAttribute a = attrs[i]; if (a == anode) { if (++i == count) return false; return m_cur = attrs[i]; } } return false; }