void CTreeBuilder::ReadConfig() { int depth = 0; CTreeNode* pParentNode = NULL; CTreeNode* pCurrentNode = NULL; CTreeNode* pSiblings = NULL; string xmlLine; ifstream infile; infile.open (m_sFileName.c_str(), ifstream::in); while(infile.good()) { string test; getline(infile,xmlLine); if ( !xmlLine.empty()) { NodeDetails nodeDetails; string nodeName = "", nodeText = ""; ValidateTag(xmlLine, nodeDetails); pCurrentNode = AddNode(pCurrentNode, nodeDetails); } } infile.close(); }
BOOL CXmlDocument::Parse(LPCTSTR lpszString) { // clean previous document data DeleteContents(); // save string m_strXml = lpszString; BOOL bInsideTag = FALSE; CString strTag, strData, strResult; for(int i=0; i<m_strXml.GetLength(); i++) { TCHAR ch = m_strXml[i]; // begin of tag ? if(ch == '<') { strTag += ch; // add data to element m_pCurElement->m_strData = strData; // trim spaces m_pCurElement->m_strData.TrimLeft(); m_pCurElement->m_strData.TrimRight(); // clear data strData = ""; // processing tag... bInsideTag = TRUE; continue; } // end of tag ? if(ch == '>') { strTag += ch; // determine type and name of the tag int nType = ValidateTag(strTag, strResult); // clear tag strTag = ""; // skip errors/comments/declaration if (nType == -1) { continue; } // start or start-end tag -> add new element if(nType == 0 || nType == 2) { // currently processing root element ? if (m_RootElement.m_strName.IsEmpty()) { // split name and attributes int nPos = strResult.Find(' '); if (nPos != -1) { // set properties of root element m_RootElement.m_strName = strResult.Left(nPos); m_RootElement.m_strAttributes = strResult.Mid(nPos+1); // trim spaces m_RootElement.m_strAttributes.TrimLeft(); m_RootElement.m_strAttributes.TrimRight(); } else { m_RootElement.m_strName = strResult; } } else { // create new element CXmlElement *pElement = new CXmlElement; pElement->m_pParentElement = m_pCurElement; // split name and attributes int nPos = strResult.Find(' '); if (nPos != -1) { // set properties of current element pElement->m_strName = strResult.Left(nPos); pElement->m_strAttributes = strResult.Mid(nPos+1); // trim spaces pElement->m_strAttributes.TrimLeft(); pElement->m_strAttributes.TrimRight(); } else { pElement->m_strName = strResult; } m_pCurElement->m_ChildElements.AddTail(pElement); m_pCurElement = pElement; } } // end or start-end tag -> finished with current tag if(nType == 1 || nType == 2) { // go back to parent level if (m_pCurElement->m_pParentElement != NULL) m_pCurElement = m_pCurElement->m_pParentElement; } // processing data... bInsideTag = FALSE; continue; } if(bInsideTag) { // append character to tag strTag += ch; } else { // append character to data strData += ch; } } return TRUE; }