Example #1
0
		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;
				}
			}			
		}
Example #2
0
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;
}