OP XML

来源:互联网 发布:c语言内嵌汇编 编辑:程序博客网 时间:2024/04/27 18:02

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 _DEBUGSaveXML();#endif}}}catch(_com_error & err){CString strErr = (LPCTSTR)err.Description();SetErrorInfo(strErr);return FALSE;}return TRUE;}




1 0
原创粉丝点击