⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 storexmldata.cpp

📁 XML存储二进制数据
💻 CPP
字号:
// StoreXMLData.cpp: implementation of the CStoreXMLData class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "StoreMiddle.h"
#include "StoreXMLData.h"
#include "const.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

//##ModelId=43BE06D20051
CStoreXMLData::CStoreXMLData()
{
	bIsInit = FALSE;
	uSectionCount = 0;
	bSetAnalyseNumber = false;
	bSetStationNumber = false;
	iAnalyseNumber = 0;
	iStationNumber = 0;
	bIsUpdated = false;
//	bIsAnalyseUpdated = false;
}

//##ModelId=43BE06D20052
CStoreXMLData::~CStoreXMLData()
{
	if(bIsInit){
		if(pXMLDoc!=NULL){
			pXMLDoc.Release();
			pXMLDoc = NULL;
		}
	}

}

//##ModelId=43BE06D20109
BOOL CStoreXMLData::InitXMLObject()
{
	HRESULT hr1;
	hr1 = pXMLDoc.CreateInstance(__uuidof(DOMDocument30));
	if(SUCCEEDED(hr1) ){
		bIsInit = TRUE;
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}

//##ModelId=43BE06D20080
int CStoreXMLData::LoadXMLFile(LPCTSTR xmlTemplateFile)
{
	if(!InitXMLObject()){
		return INITXMLOBJECTFAILURE;
	}
	if(!bIsInit) 
	{
		TRACE0("调用InitXMLObject函数存在问题!");
		return INITXMLOBJECTFAILURE;
	}
	
	if(!bSetAnalyseNumber && !bSetStationNumber)
	{
		return NUMBERNOTSET;
	}
	// 加入查找文件存在性
	if(!FindFile(xmlTemplateFile))
	{
		return FILENOTEXIST;
	}		


	try{
		pXMLDoc->load(xmlTemplateFile);
		if(bSetAnalyseNumber && iAnalyseNumber>0){
			IXMLDOMElementPtr pXMLRoot=NULL,pCurrentDOMElement=NULL;
			pXMLRoot = IXMLDOMElementPtr(pXMLDoc->selectSingleNode("root"));
			if(pXMLRoot==NULL){
				TRACE0("XML文件格式无效!");
				return FILEFORMATINVALID;
			}
			IXMLDOMNodeListPtr nodeList = NULL;
			nodeList = pXMLRoot->GetchildNodes();
			for(int i=0;i<nodeList->length;i++){
				pCurrentDOMElement = (IXMLDOMElementPtr)(nodeList->item[i]);
				CString a;
				a = (CHAR*)(LPCTSTR)(pCurrentDOMElement->GetnodeName());
				if (a.Compare(ANALYSESYMBOL)==0) {
					// 设置属性
					for(int i=1;i<=iAnalyseNumber;i++){
						IXMLDOMAttributePtr LenAttributeNode;
						a.Format("analyse%d",i);
						LenAttributeNode = pXMLDoc->createAttribute(LPCTSTR(a));
						LenAttributeNode->Putvalue(long(0));
						pCurrentDOMElement->setAttributeNode(LenAttributeNode);
						LenAttributeNode.Release();
						LenAttributeNode = NULL;
					}
					break;					
				}		
			}
			if (nodeList!=NULL)
			{
				nodeList.Release();
				nodeList = NULL;
			}

			if (pCurrentDOMElement != NULL)
			{
				pCurrentDOMElement.Release();
				pCurrentDOMElement = NULL;
			}
			pXMLRoot.Release();
			pXMLRoot = NULL;
		}
		if(bSetStationNumber && iStationNumber>0){
			IXMLDOMElementPtr pXMLRoot,pCurrentDOMElement;
			pXMLRoot = IXMLDOMElementPtr(pXMLDoc->selectSingleNode("root"));
			IXMLDOMNodeListPtr nodeList;
			nodeList = pXMLRoot->GetchildNodes();
			for(int i=0;i<nodeList->length;i++){
				pCurrentDOMElement = (IXMLDOMElementPtr)(nodeList->item[i]);
				CString a;
				a = (CHAR*)(LPCTSTR)(pCurrentDOMElement->GetnodeName());
				if (a.Compare(STATIONSYMBOL)==0) {
					// 设置属性
					for(int i=1;i<=iAnalyseNumber;i++){
						IXMLDOMAttributePtr LenAttributeNode;
						a.Format("station%d",i);
						LenAttributeNode = pXMLDoc->createAttribute(LPCTSTR(a));
						LenAttributeNode->Putvalue(long(0));
						pCurrentDOMElement->setAttributeNode(LenAttributeNode);
						LenAttributeNode.Release();
						LenAttributeNode = NULL;
					}
					break;	
				}
	
			}
			if (nodeList!=NULL)
			{
				nodeList.Release();
				nodeList = NULL;
			}

			if (pCurrentDOMElement != NULL)
			{
				pCurrentDOMElement.Release();
				pCurrentDOMElement = NULL;
			}
			pXMLRoot.Release();
			pXMLRoot = NULL;
		}
		
		TRACE0("XML文件加载成功!");
		return 1;
	}
	catch(_com_error e){
		CString a;
		a.Format("%s",e.ErrorMessage());
		TRACE0(a);
		return XMLFILELOADFAILURE;
	}
}

//##ModelId=43BE06D2010A
BOOL CStoreXMLData::FindFile(LPCTSTR xmlFile)
{
	//确认文件的有效性
	CFileFind find;
	if(!find.FindFile(xmlFile))
	{
		TRACE0("无效的文件名");
		find.Close();
		return false;
	}	
	else{
		find.Close();
		return true;
	}

}

//##ModelId=43BE06D2007D
int CStoreXMLData::WriteSingleBYTEData(UINT uDataLen, BYTE *buffer)
{
	IXMLDOMElementPtr pXMLRoot,pXMLBYTEDATANode;
	IXMLDOMAttributePtr LenAttributeNode;


	pXMLRoot = IXMLDOMElementPtr(pXMLDoc->selectSingleNode("root"));

	VARIANT varChunk;
	varChunk.vt = VT_ARRAY|VT_UI1;

	SAFEARRAY FAR *psa;
	SAFEARRAYBOUND rgsabound[1];
	rgsabound[0].lLbound = 0;
	rgsabound[0].cElements =uDataLen;
	
	psa = SafeArrayCreate(VT_UI1,1,rgsabound);
	for(long i=0;i<long(uDataLen);i++)
	{
		SafeArrayPutElement(psa,&i,buffer+i);
	}	
	varChunk.parray=psa;

	try{
		pXMLDoc->raw_createElement((_bstr_t)(char*)"BYTEDATA",&pXMLBYTEDATANode);
		// 设置属性
		LenAttributeNode = pXMLDoc->createAttribute("BufferLen");
		LenAttributeNode->Putvalue(long(uDataLen));
		// 设置数据类型
		pXMLBYTEDATANode->PutdataType(_T("bin.base64"));
		// 设置数据值
		pXMLBYTEDATANode->nodeTypedValue = varChunk;
		// 加入节点属性
		pXMLBYTEDATANode->setAttributeNode(LenAttributeNode);
		/************************************************************************/
		/*History:
			<author>	<time>		<version>	<desc>
		---------------------------------------------------------------------------
			蒋健华		06/07/02	  1.1.2.1	添加一个标记当前节点是否已读的属性
		/************************************************************************/

		LenAttributeNode = pXMLDoc->createAttribute("IsAnalysed");
		LenAttributeNode->Putvalue("0");
		// 加入节点属性
		pXMLBYTEDATANode->setAttributeNode(LenAttributeNode);
		// 将此节点加入到root节点下
		pXMLRoot->appendChild(pXMLBYTEDATANode);
	}
	catch (...) {
		return ADDNODEFAILURE;
	}

	try{
	// 释放_variant_t类型对象
	::VariantClear(&varChunk);
	// 将对象都释放
	LenAttributeNode.Release();
	LenAttributeNode = NULL;
	pXMLBYTEDATANode.Release();
	pXMLBYTEDATANode = NULL;
	pXMLRoot.Release();
	pXMLRoot = NULL;
	}
	catch (...) {
		return OBJECTRELEASEFAILURE;
	}
	// 写几次,计数器就加一下,便于删除
	uSectionCount++;
	return 1;
}

//##ModelId=43BE06D2006E
int CStoreXMLData::SaveAs(CString sFilePath)
{
	try{
		pXMLDoc->save(LPCTSTR(sFilePath));
	}
	catch (...) {
		return FILESAVEFAILURE;
	}
	try{
		IXMLDOMElementPtr pRoot;
		IXMLDOMNodeListPtr nodeList ;
		pRoot = pXMLDoc->selectSingleNode("root");
		nodeList = pRoot->GetchildNodes();
		int ListLen = nodeList->length;		
		while(ListLen>2){ // 第一,二个节点不删除
			pRoot->removeChild((nodeList->item[ListLen-1]));
			ListLen--;
		}
		nodeList.Release();
		nodeList = NULL;
		pRoot.Release();
		pRoot = NULL;
		return 1;
	}
	catch(...){
		//AfxMessageBox("有错误发生,文件为StoreMiddle.dll的SaveAs函数!");
		return DELETECHILDFAILURE;
	}
}

//##ModelId=43BE06D2005F
void CStoreXMLData::SetAnalyseNumber(int number)
{
	iAnalyseNumber = number;
	bSetAnalyseNumber = true;
}

//##ModelId=43BE06D2005D
void CStoreXMLData::SetStationNumber(int number)
{
	iStationNumber = number;
	bSetStationNumber = true;
}


// Function name	: CStoreXMLData::UpdateNumber
// Description	    : 
// Return type		: int 
// Argument         : int number
// History			: 2006-3-9 加入此功能,可动态修改需要解析的服务器个数
//					
int CStoreXMLData::UpdateNumber(int number)
{
	bIsUpdated = true;
	// 更新开始
		if(bIsUpdated && number>0){
/**************************************************************************************/
			try{
				IXMLDOMElementPtr pRoot;
				IXMLDOMNodeListPtr nodeList ;
				pRoot = pXMLDoc->selectSingleNode("root");
				nodeList = pRoot->GetchildNodes();
				int d = nodeList->length;
				// 删除第一,二个节点
				while(d>=1 && d<=2){ // 第一,二个节点不删除
					pRoot->removeChild((nodeList->item[d-1]));
					d--;
				}
				nodeList.Release();
				nodeList = NULL;
				pRoot.Release();
				pRoot = NULL;
			}
			catch(...){
				TRACE("有错误发生,文件为StoreMiddle.dll的UpdateNumber函数!");
				return DELETECHILDFAILURE;
			}
/**************************************************************************************/
			try{
				IXMLDOMElementPtr pXMLRoot,pCurrentDOMElement;
				pXMLRoot = IXMLDOMElementPtr(pXMLDoc->selectSingleNode("root"));
				if(pXMLRoot==NULL){
					TRACE0("XML文件格式无效!");
					return FILEFORMATINVALID;
				}
//	新创建一个节点
				IXMLDOMElementPtr pXMLBYTEDATANode;
				try{

					pXMLDoc->raw_createElement((_bstr_t)(char*)"AnalyseSymbol",&pXMLBYTEDATANode);
					// 将此节点加入到root节点下
					pXMLRoot->appendChild(pXMLBYTEDATANode);
				}
				catch (...) {
					return ADDNODEFAILURE;
				}
				try{
					pXMLDoc->raw_createElement((_bstr_t)(char*)"StationSymbol",&pXMLBYTEDATANode);
					// 将此节点加入到root节点下
					pXMLRoot->appendChild(pXMLBYTEDATANode);

				}
				catch (...) {
					return ADDNODEFAILURE;
				}
				pXMLBYTEDATANode.Release();
				pXMLBYTEDATANode = NULL;
// 添加结束
				IXMLDOMNodeListPtr nodeList;
				nodeList = pXMLRoot->GetchildNodes();
				bool t1,t2;
				t1 = false;
				t2 = false;
				for(int i=0;i<nodeList->length;i++){
					pCurrentDOMElement = (IXMLDOMElementPtr)(nodeList->item[i]);
					CString a="";
					a = (CHAR*)(LPCTSTR)(pCurrentDOMElement->GetnodeName());
					if (a.Compare(ANALYSESYMBOL)==0) {
						// 设置属性
						for(int i=1;i<=number;i++){
							IXMLDOMAttributePtr LenAttributeNode;
							a.Format("analyse%d",i);
							LenAttributeNode = pXMLDoc->createAttribute(LPCTSTR(a));
							LenAttributeNode->Putvalue(long(0));
							pCurrentDOMElement->setAttributeNode(LenAttributeNode);
							LenAttributeNode.Release();
							LenAttributeNode = NULL;
						}
						t1 = true;
						//break;					
					}
					if (a.Compare(STATIONSYMBOL)==0) {
 						// 设置属性
 						for(int i=1;i<=number;i++){
 							IXMLDOMAttributePtr LenAttributeNode;
 							a.Format("station%d",i);
 							LenAttributeNode = pXMLDoc->createAttribute(LPCTSTR(a));
 							LenAttributeNode->Putvalue(long(0));
 							pCurrentDOMElement->setAttributeNode(LenAttributeNode);
							LenAttributeNode.Release();
 							LenAttributeNode = NULL;
 						}
						t2 = true;	
 					}
					if(t1 && t2)
					{break;}
				}
				nodeList.Release();
				nodeList = NULL;
				pCurrentDOMElement.Release();
				pCurrentDOMElement = NULL;
				nodeList.Release();
				nodeList = NULL;
				pXMLRoot.Release();
				pXMLRoot = NULL;
				// 赋值操作
				iAnalyseNumber = iStationNumber = number;
				return 1;
			}
			catch (...) {
				return -1;
			}
		}
		return 1;

}


// Function name	: CStoreXMLData::UpdateStationNumber
// Description	    : 
// Return type		: int 
// Argument         : int number
// History			: 2006-3-9 加入此功能,可动态修改需要上传的服务器个数
//DEL int CStoreXMLData::UpdateStationNumber(int number)
//DEL {
//DEL 	iStationNumber = number;
//DEL 	bIsStationUpdated = true;
//DEL 	if(bIsStationUpdated && iStationNumber>0){
//DEL /**************************************************************************************/
//DEL 			try{
//DEL 				IXMLDOMElementPtr pRoot;
//DEL 				IXMLDOMNodeListPtr nodeList ;
//DEL 				pRoot = pXMLDoc->selectSingleNode("root");
//DEL 				nodeList = pRoot->GetchildNodes();
//DEL 				// 删除第二个节点
//DEL 				pRoot->removeChild((nodeList->item[1]));
//DEL 				nodeList.Release();
//DEL 				nodeList = NULL;
//DEL 				pRoot.Release();
//DEL 				pRoot = NULL;
//DEL 			}
//DEL 			catch(...){
//DEL 				TRACE("有错误发生,文件为StoreMiddle.dll的UpdateStationNumber函数!");
//DEL 				return DELETECHILDFAILURE;
//DEL 			}
//DEL /**************************************************************************************/
//DEL 				IXMLDOMElementPtr pXMLRoot,pCurrentDOMElement;
//DEL 				pXMLRoot = IXMLDOMElementPtr(pXMLDoc->selectSingleNode("root"));
//DEL 				if(pXMLRoot==NULL){
//DEL 					TRACE0("XML文件格式无效!");
//DEL 					return FILEFORMATINVALID;
//DEL 				}
//DEL //	新创建一个节点
//DEL 				try{
//DEL 					IXMLDOMElementPtr pXMLBYTEDATANode;
//DEL 					pXMLDoc->raw_createElement((_bstr_t)(char*)"StationSymbol",&pXMLBYTEDATANode);
//DEL 					// 将此节点加入到root节点下
//DEL 					pXMLRoot->appendChild(pXMLBYTEDATANode);
//DEL 					pXMLBYTEDATANode.Release();
//DEL 					pXMLBYTEDATANode = NULL;
//DEL 				}
//DEL 				catch (...) {
//DEL 					return ADDNODEFAILURE;
//DEL 				}
//DEL 
//DEL 				try{				
//DEL 
//DEL 				IXMLDOMNodeListPtr nodeList;
//DEL 				nodeList = pXMLRoot->GetchildNodes();
//DEL 				for(int i=0;i<nodeList->length;i++){
//DEL 					pCurrentDOMElement = (IXMLDOMElementPtr)(nodeList->item[i]);
//DEL 					CString a;
//DEL 					a = (CHAR*)(LPCTSTR)(pCurrentDOMElement->GetnodeName());
//DEL 					if (a.Compare(STATIONSYMBOL)==0) {
//DEL 						// 设置属性
//DEL 						for(int i=1;i<=iAnalyseNumber;i++){
//DEL 							IXMLDOMAttributePtr LenAttributeNode;
//DEL 							a.Format("station%d",i);
//DEL 							LenAttributeNode = pXMLDoc->createAttribute(LPCTSTR(a));
//DEL 							LenAttributeNode->Putvalue(long(0));
//DEL 							pCurrentDOMElement->setAttributeNode(LenAttributeNode);
//DEL 							LenAttributeNode.Release();
//DEL 							LenAttributeNode = NULL;
//DEL 						}
//DEL 						break;	
//DEL 					}
//DEL 		
//DEL 				}
//DEL 				pXMLRoot.Release();
//DEL 				pXMLRoot = NULL;
//DEL 				return 1;
//DEL 			}
//DEL 			catch (...) {
//DEL 				return -1;
//DEL 			}
//DEL 		}
//DEL 	return 1;
//DEL }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -