OP XML

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



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值