CXmlItem* CXmlItem::SetItemValue(const CString& sName, const CString& sValue, XI_TYPE nType) { CXmlItem* pXI = GetItem(sName); if (!pXI) return AddItem(sName, sValue, nType); // else already exists pXI->SetValue(sValue); pXI->SetType(nType); return pXI; }
BOOL CXmlFile::ParseItem(CXmlItem& xi, CXmlNodeWrapper* pNode) { CStringArray aNames, aValues; int nNumAttrib = pNode->GetAttributes(aNames, aValues); for (int nAttrib = 0; nAttrib < nNumAttrib; nAttrib++) { const CString& sName = aNames[nAttrib]; const CString& sVal = aValues[nAttrib]; xi.AddItem(sName, sVal); if (!ContinueParsing(sName, sVal)) return TRUE; } CXmlNodeWrapper nodeChild(pNode->GetFirstChildNode()); //for (int nNode = 0; nNode < nNumNodes; nNode++) while (nodeChild.IsValid()) { CString sName(nodeChild.Name()); CString sVal(nodeChild.GetText()); // Valik - Fully qualify NODE_CDATA_SECTION to prevent an ambiguous symbol error (C2872) in VC 7.1 int nNodeType = nodeChild.NodeTypeVal(); XI_TYPE nType = XIT_ELEMENT; if (nNodeType == MSXML2::NODE_CDATA_SECTION) nType = XIT_CDATA; else if (nNodeType == MSXML2::NODE_ATTRIBUTE) nType = XIT_ATTRIB; // if sName is empty then sVal relates to pNode if (!sName.IsEmpty()) { CXmlItem* pXI = xi.AddItem(sName, sVal, nType); if (!ContinueParsing(sName, sVal)) return TRUE; ParseItem(*pXI, &nodeChild); } // need to take care here not to overwrite a node's value by carriage returns // which can result if we load the XML preserving whitespace else { //BOOL bHasValue = (xi.GetValueLen() != 0); //BOOL bValueIsCR = (sVal == "\n"); //if (nodeChild.IsPreservingWhiteSpace() && bHasValue && bValueIsCR) if (nodeChild.IsPreservingWhiteSpace() && (xi.GetValueLen() != 0) && (sVal == "\n")) { // ignore ASSERT(1); // for debugging } else { xi.SetValue(sVal); xi.SetType(nType); } } nodeChild = nodeChild.GetNextSibling(); } return TRUE; }