OP XML

    xiaoxiao2021-12-14  21

    C++ 操作XML文件:

    xml扩展功能标记语言,是目前主流的数据交换和数据配置的工具,操作XML就成为必备,包括读和写:

    一、读取XML:

    CStdioFile file; file.Open ("f:\\a.txt",CFile::modeCreate|CFile::modeWrite); CString str; unsigned short buff[128]; memset(buff,0,128); _bstr_t sname[1024]; _bstr_t qianzi[1024]; _bstr_t bstrname[1024]; _bstr_t CAPP[1024]; _bstr_t strstr; strstr="->"; _bstr_t en; _bstr_t strMsg="节点名:"; _bstr_t strmsg="节点值:"; MSXML::IXMLDOMDocumentPtr xdoc; xdoc.CreateInstance(__uuidof(MSXML::DOMDocument)); xdoc->load("E:\\PIMSBOFCSI0009001.xml"); MSXML::IXMLDOMNodeListPtr nodelist=NULL; nodelist=xdoc->selectNodes("签字列表/节点");//匹配项 MSXML::IXMLDOMNodePtr subnode; long nodecount; nodelist->get_length(&nodecount); try{ for(long i=0;i<nodecount;i++) { subnode=nodelist->nextNode()->selectSingleNode((_bstr_t)"节点名称"); if(subnode!=NULL) { bstrname[i]=subnode->Gettext(); // m_xmllist.InsertItem(i,""); // m_xmllist.SetItemText(i,0,"节点名称"); // m_xmllist.SetItemText(i,1,bstrname[i]); // _bstr_t str1="节点名称"; //en="["+strMsg+str1+"]"+strstr+"["+strmsg+bstrname[i]+"]"+"\r\n"; // file.WriteString (en); } } nodelist->reset (); for(i=0;i<nodecount;i++) { subnode=nodelist->nextNode()->selectSingleNode((_bstr_t)"属性名称"); if(subnode!=NULL) { sname[i]=subnode->Gettext(); // m_xmllist.SetItemText(i+nodecount,0,"属性名称"); // m_xmllist.SetItemText(i+nodecount,1,sname[i]); // _bstr_t str2="属性名称"; // en="["+strMsg+str2+"]"+strstr+"["+strmsg+sname[i]+"]"+"\r\n"; // file.WriteString (en); } } nodelist->reset (); for (i=0;i<nodecount;i++) { subnode=nodelist->nextNode()->selectSingleNode((_bstr_t)"签字时间属性名称"); if(subnode!=NULL) { qianzi[i]=subnode->Gettext (); // m_xmllist.SetItemText (i+2*nodecount,0,"签字时间属性名称"); // m_xmllist.SetItemText (i+2*nodecount,1,qianzi[i]); // _bstr_t str3="签字时间属性名称"; //en="["+strMsg+str3+"]"+strstr+"["+strmsg+qianzi[i]+"]"+"\r\n"; //file.WriteString (en); } } nodelist->reset (); for (i=0;i<=nodecount;i++) { subnode=nodelist->nextNode ()->selectSingleNode((_bstr_t)"CAPP属性集名称"); if(subnode!=NULL) { CAPP[i]=subnode->Gettext (); // m_xmllist.SetItemText (i+3*nodecount,0,"CAPP属性集名称"); // m_xmllist.SetItemText (i+3*nodecount,1,CAPP[i]); // _bstr_t str4="CAPP属性集名称"; //en="["+strMsg+str4+"]"+strstr+"["+strmsg+CAPP[i]+"]"+"\r\n"; //file.WriteString (en); } } } //抛出异常 catch(_com_error& err) { // return; } //读取XML文件内容 MSXML2::IXMLDOMDocumentPtr pXMLDoc = NULL; pXMLDoc.CreateInstance(__uuidof(MSXML2::DOMDocument)); if(pXMLDoc == NULL) return FALSE; pXMLDoc->async = 0 ;//False; VARIANT_BOOL vbRet = pXMLDoc->load(_variant_t(strXMLFile)); if (vbRet == VARIANT_FALSE || pXMLDoc->parseError == NULL) return FALSE; if (pXMLDoc->parseError->errorCode != 0) return FALSE; if (pXMLDoc->readyState != 4) return FALSE; MSXML2::IXMLDOMNodePtr xmlNode ; xmlNode = pXMLDoc->documentElement->selectSingleNode(_T("//xxx")); if( xmlNode == NULL) return FALSE; //获取子节点对象 MSXML2::IXMLDOMNodeListPtr xmlNodeList = xmlNode->GetchildNodes(); MSXML2::IXMLDOMNodePtr xmlChildNode; long i = 0; for (i == 0; i < xmlNodeList->Getlength(); i++) { //获取指定索引的子节点对象 xmlChildNode = xmlNodeList->Getitem(i); CString strNodeName = xmlChildNode->nodeName; if (strNodeName == _T("wwww")) { _variant_t value = xmlChildNode->text; if(value.vt != VT_NULL) { // CString strPropPageName = CString(value.bstrVal); } } } } catch( _com_error& err) { return FALSE; } catch(...) { return FALSE; } 二、 写XML

    HRESULT hr = m_pXMLDoc.CreateInstance(__uuidof(MSXML2::DOMDocument)); ASSERT(hr == S_OK); IXMLDOMProcessingInstructionPtr pi = m_pXMLDoc->createProcessingInstruction(_bstr_t(_T("xml")), _bstr_t(_T("version=\"1.0\" encoding=\"UTF-8\""))); MSXML2::IXMLDOMNodePtr nodePi = pi; m_pXMLDoc->appendChild(nodePi); BOOL CXMLDocManager::SaveXML() { if(m_pXMLDoc != NULL && !m_strXMLFilePath.IsEmpty()) { try { // 如果存在指定文件,确保该文件具有可写属性 MakeFileReadWrite(m_strXMLFilePath); _variant_t var = m_strXMLFilePath; m_pXMLDoc->save(var); } catch(_com_error & err) { CString strErr = (LPCTSTR)err.Description(); SetErrorInfo(strErr); return FALSE; } catch(CException* err) { TCHAR buffer[1024] = {0}; err->GetErrorMessage(buffer, 1024); CString strErr = buffer; SetErrorInfo(strErr); return FALSE; } } return TRUE; } BOOL CXMLDocManager::MakeFileReadWrite(const CString& strFileName) { CFileStatus status; BOOL bRetVal = CFile::GetStatus(strFileName, status); if(bRetVal) { status.m_attribute &= ~CFile::readOnly; CFile::SetStatus(strFileName, status); } return bRetVal; } BOOL CXMLDocManager::ExpNormalProptyNode(const LONG lUnitID, // 单元ID const LONG lProptysetID, // 属性集ID const LONG lProptyID, // 属性ID const CString& strProptyName, // 属性名 const CString& strProptyValue) // 属性值 { try { MSXML2::IXMLDOMNodePtr nodeProptyset = GetSpecificProptysetNode(lUnitID, lProptysetID); if(nodeProptyset != NULL) { MSXML2::IXMLDOMNodePtr nodeParent = nodeProptyset->selectSingleNode((_bstr_t)_T("普通属性")); if(nodeParent == NULL) { nodeParent = m_pXMLDoc->createElement((_bstr_t)_T("普通属性")); nodeProptyset->appendChild(nodeParent); } ASSERT(nodeParent != NULL); CString strProptyID; strProptyID.Format(_T("%ld"), lProptyID); if(strProptyName != _T("")) { MSXML2::IXMLDOMElementPtr pNode = m_pXMLDoc->createElement(_T("字段")); pNode->setAttribute(_T("FIELDID"), (_bstr_t)strProptyID); pNode->setAttribute(_T("NAME"), (_bstr_t)strProptyName); pNode->text = (_bstr_t)strProptyValue; nodeParent->appendChild(pNode); #ifdef _DEBUG SaveXML(); #endif } } } catch(_com_error & err) { CString strErr = (LPCTSTR)err.Description(); SetErrorInfo(strErr); return FALSE; } return TRUE; }

    读取节点属性

    <?xml version="1.0" encoding="gb2312" ?> <UnitType> <ListCtrlData CardName="工艺总方案封面YB-2" PtyName="aaa||bbb||ccc||ddd||eee||fff"/> </UnitType>

    BOOL EditReleaseOnLineFile::ReadXML(const CString strTypeName) { TCHAR buffer[MAX_PATH] = {0}; ::GetModuleFileName(NULL, buffer, MAX_PATH); CString strPath = buffer; int nIndex = strPath.ReverseFind(_T('\\')); strPath = strPath.Left(nIndex + 1); CString strConfigFile = strPath + _T("PIMSHQERON001100.xml"); try{ MSXML2::IXMLDOMDocumentPtr xdoc; xdoc.CreateInstance(__uuidof(MSXML2::DOMDocument)); if(xdoc == NULL) { AfxMessageBox(_T("创建XML文档对象失败")); return FALSE; } xdoc->load(_variant_t(strConfigFile)); MSXML2::IXMLDOMNodeListPtr nodelist = NULL; nodelist =xdoc->documentElement->selectNodes(_T("//ListCtrlData")); MSXML2::IXMLDOMNodePtr subnode; MSXML2::IXMLDOMNodePtr subnode1; MSXML2::IXMLDOMNamedNodeMapPtr pNamedNodeMap= NULL;   MSXML2::IXMLDOMNodePtr pAttribNode= NULL;    long nodecount; nodelist->get_length(&nodecount); for(long i = 0; i < nodecount; i++) { subnode = nodelist->Getitem(i); /*_variant_t getAttribute ( _bstr_t name );*/ MSXML2::IXMLDOMElementPtr O; //subnode = nodelist->nextNode()->selectSingleNode((_bstr_t)strTypeName); if(subnode != NULL) { CString strN; CString strUnitTypeGUID; strUnitTypeGUID = subnode->attributes->getNamedItem("CardName")->nodeValue; } } } catch(...) { AfxMessageBox(_T("读取配置文件失败")); return FALSE; } return TRUE; }

    转载请注明原文地址: https://ju.6miu.com/read-962373.html

    最新回复(0)