Пример #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;
				}
			}			
		}
Пример #2
0
void XmlNodeReader::Skip() const {
	if (ReadState == ReadState::Interactive) {
		MoveToElement ();
		if (NodeType != XmlNodeType::Element || IsEmptyElement())
			Read();
		else {
			for (int depth=Depth; Read() && depth<Depth; )
				;
			if (NodeType == XmlNodeType::EndElement)
				Read ();
		}
	}
}
Пример #3
0
bool XmlNodeReader::Read() const {
	switch (get_ReadState()) {
	case Ext::ReadState::EndOfFile:
	case Ext::ReadState::Error:
	case Ext::ReadState::Closed:
		return false;
	case Ext::ReadState::Initial:		
		m_linkedNode = m_cur = m_startNode;
		m_readState = Ext::ReadState::Interactive;
		return bool(m_cur);
	}
//	TRC(4, int(m_cur.NodeType) << "  " << &m_cur.R << "   StartNode type: " << int(m_startNode.NodeType) << "  " << &m_startNode.R);
	MoveToElement();

	if (XmlNode firstChild = !m_bEndElement ? m_cur.FirstChild : XmlNode()) {
		++m_depth;
		m_linkedNode = m_cur = firstChild;
		return true;
	}
	if (m_cur == m_startNode) {
		if (!(m_bEndElement = !IsEmptyElement() && !m_bEndElement)) {
			m_cur = XmlNode();
			m_readState = ReadState::EndOfFile;
		}
		m_linkedNode = m_cur;
		return m_bEndElement;
	}
	XmlNodeType curType = m_cur.NodeType;
	if (!m_bEndElement && !IsEmptyElement() && curType==XmlNodeType::Element)
		return m_bEndElement = true;
	if (XmlNode next = m_cur.NextSibling) {
		m_linkedNode = m_cur = next;
		return !(m_bEndElement = false);
	}
	XmlNode parent;
	if (curType != XmlNodeType::Document) {
		parent = m_cur.ParentNode;
	//	TRC(4, "Parent: " << int(parent.NodeType) << "  " << &parent.R);
	}
	if (m_bEndElement = parent && parent!=m_startNode) {
		m_cur = parent;
		--m_depth;
	} else {
		m_cur = nullptr;
		m_readState = ReadState::EndOfFile;
	}
	m_linkedNode = m_cur;
	return m_bEndElement;
}
Пример #4
0
	XMLReader::NodeType XMLReader::MoveToContent() {
	    // (non-white space text, CDATA, Element, EndElement, EntityReference, or EndEntity)
	    do {
#if 0
	        // We don't support MoveToAttribute, so we don't need this code yet.
            if (mNodeType == kAttribute) {
                MoveToElement();
                return mNodeType;
            }
            else
#endif
            if ((mNodeType == kText) || (mNodeType == kCDATA) || (mNodeType == kElement)
                    || (mNodeType == kEndElement) || (mNodeType == kEntityReference)
                    || (mNodeType == kEndEntity)) {
                return mNodeType;
            }
	    } while (Read());
        return mNodeType;
	}