~storexmldata.~cpp

来自「XML存储二进制数据」· ~CPP 代码 · 共 265 行

~CPP
265
字号
// 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
//////////////////////////////////////////////////////////////////////

CStoreXMLData::CStoreXMLData()
{
	bIsInit = FALSE;
	uSectionCount = 0;
	bSetAnalyseNumber = false;
	bSetStationNumber = false;
	iAnalyseNumber = 0;
	iStationNumber = 0;
}

CStoreXMLData::~CStoreXMLData()
{
	if(bIsInit){
		if(pXMLDoc!=NULL){
			pXMLDoc.Release();
			pXMLDoc = NULL;
		}
	}

}

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

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,pCurrentDOMElement;
			pXMLRoot = IXMLDOMElementPtr(pXMLDoc->selectSingleNode("root"));
			if(pXMLRoot==NULL){
				TRACE0("XML文件格式无效!");
				return FILEFORMATINVALID;
			}
			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(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;					
				}		
			}
			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;	
				}
	
			}
			pXMLRoot.Release();
			pXMLRoot = NULL;
		}
		
		TRACE0("XML文件加载成功!");
		return 1;
	}
	catch(_com_error e){
		CString a;
		a.Format("%s",e.ErrorMessage());
		TRACE0(a);
		return XMLFILELOADFAILURE;
	}
}

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

}

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);
		// 将此节点加入到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;
}

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

void CStoreXMLData::SetAnalyseNumber(int number)
{
	iAnalyseNumber = number;
	bSetAnalyseNumber = true;
}

void CStoreXMLData::SetStationNumber(int number)
{
	iStationNumber = number;
	bSetStationNumber = true;
}

⌨️ 快捷键说明

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