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; } } }
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 (); } } }
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; }
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; }