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

📄 readxmldata.cpp

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

#include "stdafx.h"
#include "ReadMiddle.h"
#include "ReadXMLData.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
#include "const.h"
//##ModelId=43BE06CC01F4
CReadXMLData::CReadXMLData()
{
	bIsInit = false;
}

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

}

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

//##ModelId=43BE06CD009C
BOOL CReadXMLData::InitXMLObject()
{

	HRESULT hr1;
	hr1 = pXMLDoc.CreateInstance(__uuidof(DOMDocument30));
	if(SUCCEEDED(hr1) ){
		//pXMLDoc->put_validateOnParse(VARIANT_FALSE),
		bIsInit = TRUE;
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}

//##ModelId=43BE06CC0281
int CReadXMLData::LoadXMLFile(CString xmlTemplateFile)
{
	if(!InitXMLObject()){
		return INITXMLOBJECTFAILURE;
	}
	if(!bIsInit) 
	{
		TRACE0("调用InitXMLObject函数存在问题!");
		return INITXMLOBJECTFAILURE;
	}
	
	// 加入查找文件存在性
	if(!FindFile(xmlTemplateFile))
	{
		return FILENOTEXIST;
	}
	
	try{
		// 这里加上一个处理bool返回类型
			VARIANT_BOOL b;
			BSTR bstr = NULL;
			pXMLDoc->load(_bstr_t(xmlTemplateFile));
			pXMLDoc->get_validateOnParse(&b);
			//if (b!=VARIANT_TRUE) {
				IXMLDOMParseError *pXMLErr=NULL;
				pXMLDoc->get_parseError(&pXMLErr);
					pXMLErr->get_reason(&bstr);	
					if(bstr!=NULL)
					{
						TRACE1("%S",bstr);
						try
						{
							pXMLDoc.Release();
							pXMLDoc = NULL;
							//return 1;
						}
						catch (...) {
							return OBJECTRELEASEFAILURE;
							
						}
						return FILEFORMATINVALID;
					}

		//	}

		// FILEFORMATINVALID
		// 加入格式验证信息
		// 2005-12-19
		IXMLDOMElementPtr pXMLRootNode;
		pXMLRootNode = IXMLDOMElementPtr(pXMLDoc->selectSingleNode("root"));
		bool bFind1=false,bFind2=false,bFind3=false;
		if(pXMLRootNode!=NULL){
			IXMLDOMNodeListPtr nodeList = pXMLRootNode->GetchildNodes();
			if(nodeList==NULL){
				pXMLRootNode.Release();
				pXMLRootNode = NULL;
				return FILEFORMATINVALID; 
			}
			IXMLDOMNodePtr childNodePtr;
			long nCount = nodeList->length;
			for(int i=0;i<3;i++)
			{
				childNodePtr = nodeList->item[i];
				if(childNodePtr==NULL){
					nodeList.Release();
					nodeList = NULL;
					pXMLRootNode.Release();
					pXMLRootNode = NULL;
					break;
					return FILEFORMATINVALID; 
				}
				else
				{
					// bFind1 bFind2
					CString a = (char*)(_bstr_t)(childNodePtr->GetnodeName());
					if (a.CollateNoCase("AnalyseSymbol")==0) {
						bFind1 = true;
					}
					if (a.CollateNoCase("StationSymbol")==0) {
						bFind2 = true;
					}
					if (a.CollateNoCase("BYTEDATA")==0) {
						bFind3 = true;
					}
				}
			}
			childNodePtr.Release();
			childNodePtr = NULL;
			nodeList.Release();
			nodeList = NULL;
			if((!bFind1) || (!bFind2) || (!bFind3)){
				TRACE0("XML文件格式错误!");
				pXMLRootNode.Release();
				pXMLRootNode = NULL;
				return FILEFORMATINVALID;
			}
		}
		else{
			TRACE0("XML文件格式错误!");
			return FILEFORMATINVALID;
		}
		pXMLRootNode.Release();
		pXMLRootNode = NULL;
		TRACE0("XML文件加载成功!");
		lpxmlFile = xmlTemplateFile;
		return 1;
	}
	catch(_com_error e){
		CString a;
		a.Format("%s",e.ErrorMessage());
		TRACE0(a);
		return XMLFILELOADFAILURE;
	}
}

//##ModelId=43BE06CC0280
int CReadXMLData::CloseFile()
{
	try
	{
		pXMLDoc.Release();
		pXMLDoc = NULL;
		return 1;
	}
	catch (...) {
		return OBJECTRELEASEFAILURE;
	}
}

//##ModelId=43BE06CC0271
int CReadXMLData::ReadBuffer(PBYTE pBuffer, int& bufferLen, int pos,int& bIsAnalysed)
{
	if (pXMLDoc==NULL) {
		TRACE0("DOC对象为空!");
		return -1;
	}
	ASSERT(pXMLDoc!=NULL);
	if (pos>0) {
		try{
			IXMLDOMElementPtr pXMLRootNode;		
			pXMLRootNode = IXMLDOMElementPtr(pXMLDoc->selectSingleNode("root"));
			if(pXMLRootNode!=NULL){
				IXMLDOMNamedNodeMapPtr pAttrs = NULL; 
				IXMLDOMNodePtr pAttrItem = NULL;				
				IXMLDOMNodeListPtr nodeList = pXMLRootNode->GetchildNodes();
				if(nodeList==NULL){
					pXMLRootNode.Release();
					pXMLRootNode = NULL;
					return FILEFORMATINVALID;
				}
				IXMLDOMNodePtr childNodePtr = NULL;
				DOMNodeType nodeType;
				long nCount = nodeList->length;
				if(nCount<=2){
					return XMLFORMATERROR;
				}
				long nCount_ = 0;
				CString strAttrName="";
				CString strAttrValue="";
				childNodePtr = nodeList->item[pos+1];
				if(childNodePtr!=NULL){
					childNodePtr->get_attributes(&pAttrs);
					pAttrs->get_length(&nCount_);
					nodeType = childNodePtr->nodeType;
					if(nodeType == NODE_ELEMENT)
					{
						for(int j=0;j<nCount_;j++){
							pAttrs->get_item(j,&pAttrItem);
							strAttrName  = (char*)(_bstr_t)pAttrItem->nodeName;
							if(strAttrName.Compare("BufferLen")==0){
								strAttrValue  = (char*)(_bstr_t)pAttrItem->nodeTypedValue;
								bufferLen = atoi(strAttrValue);
								_variant_t vBuffer;
								vBuffer =  childNodePtr->nodeTypedValue;
								for(long i=0;i<bufferLen;i++)
								{
									SafeArrayGetElement(vBuffer.parray,&i,pBuffer+i);
								}
								::VariantClear(&vBuffer);
								//break;
							}
							if(strAttrName.Compare("IsAnalysed")==0){
								strAttrValue  = (char*)(_bstr_t)pAttrItem->nodeTypedValue;
								bIsAnalysed = atoi(strAttrValue);
								break;
							}
						}
					}
				}
				else{
					nodeList.Release();
					nodeList = NULL;
					pXMLRootNode.Release();
					pXMLRootNode = NULL;
					return POSITIONNULL;
				}

				if(pAttrs!=NULL){
					pAttrs.Release();
					pAttrs = NULL; 
				}
				if(pAttrItem!=NULL){
					pAttrItem.Release();
					pAttrItem = NULL;					
				}
				if(pAttrItem!=NULL){
					nodeList.Release();
					nodeList = NULL;
				}
				if(childNodePtr!=NULL){
					childNodePtr.Release();
					childNodePtr = NULL;					
				}
	
			}
			else
			{
				return FILEFORMATINVALID;
			}
			pXMLRootNode.Release();
			pXMLRootNode = NULL;
		}
		catch (...) {
			TRACE0("对象操作异常!");
			return XMLNODESELECTFAILURE;
		}
		return 1;
	}
	else
	{
		return POSITIONNULL;
	}
}

//##ModelId=43BE06CC0206
BOOL CReadXMLData::SetState(CString strInstruction, int index,CString strValue)
{
	if(!bIsInit) return INITXMLOBJECTFAILURE;
	ASSERT(pXMLDoc!=NULL);
	if(strInstruction!="" && index>0){	
		try{
			IXMLDOMElementPtr pXMLRootNode;		
			pXMLRootNode = IXMLDOMElementPtr(pXMLDoc->selectSingleNode("root"));
			if(pXMLRootNode!=NULL){
				IXMLDOMNamedNodeMapPtr pAttrs = NULL; 
				IXMLDOMNodePtr pAttrItem = NULL;				
				IXMLDOMNodeListPtr nodeList = pXMLRootNode->GetchildNodes();
				if(nodeList==NULL){
					pXMLRootNode.Release();
					pXMLRootNode = NULL;
					return FILEFORMATINVALID;
				}
				IXMLDOMNodePtr childNodePtr = NULL;
				DOMNodeType nodeType;
				long nCount = nodeList->length;
				if(nCount<=2){
					return XMLFORMATERROR;
				}
				long nCount_ = 0;
				CString strAttrName="";
				CString strAttrValue="";
				CString strAttributeInstru="";

				if(strInstruction.Compare(ANALYSESYMBOL)==0 || strInstruction.CompareNoCase("a")==0){
					childNodePtr = nodeList->item[0];
					strAttributeInstru.Format("analyse%d",index);
				}
				else if(strInstruction.Compare(STATIONSYMBOL)==0 || strInstruction.CompareNoCase("s")==0){
					childNodePtr = nodeList->item[1];
					strAttributeInstru.Format("station%d",index);
				}

				if(childNodePtr!=NULL){
					childNodePtr->get_attributes(&pAttrs);
					pAttrs->get_length(&nCount_);
					nodeType = childNodePtr->nodeType;					
					if(nodeType == NODE_ELEMENT)
					{
						for(int j=0;j<nCount_;j++){
							pAttrs->get_item(j,&pAttrItem);
							strAttrName  = (char*)(_bstr_t)pAttrItem->nodeName;
							if(strAttrName.Compare(strAttributeInstru)==0){
								pAttrItem->nodeValue = (LPCTSTR)strValue;
								break;
							}
						}
					}
				}
				else{
					return POSITIONNULL;
				}
				pXMLDoc->save((char*)(_bstr_t)lpxmlFile);
				if(pAttrs!=NULL){
					pAttrs.Release();
					pAttrs = NULL; 
				}
				if(pAttrItem!=NULL){
					pAttrItem.Release();
					pAttrItem = NULL;					
				}
				if(pAttrItem!=NULL){
					nodeList.Release();
					nodeList = NULL;
				}
				if(childNodePtr!=NULL){
					childNodePtr.Release();
					childNodePtr = NULL;					
				}
			}
			pXMLRootNode.Release();
			pXMLRootNode = NULL;	
		}
		catch (...) {
			return GETATTRIBUTEFAILURE;
		}
		return SETSTATESUCCEEDED;
	}
	else
		return INSTRUCTIONERROR;
}

//##ModelId=43BE06CC0203
int CReadXMLData::GetState(CString strInstruction, int index)
{
	if(!bIsInit) return INITXMLOBJECTFAILURE;
	ASSERT(pXMLDoc!=NULL);
	if(strInstruction!="" && index>0){
		CString strValue="";
		try{
			IXMLDOMElementPtr pXMLRootNode;		
			pXMLRootNode = IXMLDOMElementPtr(pXMLDoc->selectSingleNode("root"));
			if(pXMLRootNode!=NULL){
				IXMLDOMNamedNodeMapPtr pAttrs = NULL; 
				IXMLDOMNodePtr pAttrItem = NULL;				
				IXMLDOMNodeListPtr nodeList = pXMLRootNode->GetchildNodes();
				if(nodeList==NULL){
					pXMLRootNode.Release();
					pXMLRootNode = NULL;
				}
				IXMLDOMNodePtr childNodePtr = NULL;
				DOMNodeType nodeType;
				long nCount = nodeList->length;
				if(nCount<=2){
					return XMLFORMATERROR;
				}
				long nCount_ = 0;
				CString strAttrName="";
				CString strAttrValue="";
				CString strAttributeInstru="";
				
				
				if(strInstruction.Compare(ANALYSESYMBOL)==0 || strInstruction.CompareNoCase("a")==0){
					childNodePtr = nodeList->item[0];	
					strAttributeInstru.Format("analyse%d",index);
				}
				else if(strInstruction.Compare(STATIONSYMBOL)==0 || strInstruction.CompareNoCase("s")==0){
					childNodePtr = nodeList->item[1];
					strAttributeInstru.Format("station%d",index);
				}
				
				if(childNodePtr!=NULL){
					childNodePtr->get_attributes(&pAttrs);
					pAttrs->get_length(&nCount_);
					nodeType = childNodePtr->nodeType;					
					if(nodeType == NODE_ELEMENT)
					{
						for(int j=0;j<nCount_;j++){
							pAttrs->get_item(j,&pAttrItem);
							strAttrName  = (char*)(_bstr_t)pAttrItem->nodeName;
							if(strAttrName.Compare(strAttributeInstru)==0){
								strValue = (char*)(_bstr_t)pAttrItem->nodeValue ;
								break;
							}
						}
					}
				}
				else{
					nodeList.Release();
					nodeList = NULL;
					pXMLRootNode.Release();
					pXMLRootNode = NULL;
					return POSITIONNULL;
				}
				pXMLDoc->save((char*)(_bstr_t)lpxmlFile);
				if(pAttrs!=NULL){
					pAttrs.Release();
					pAttrs = NULL; 
				}
				if(pAttrItem!=NULL){
					pAttrItem.Release();
					pAttrItem = NULL;					
				}
				if(pAttrItem!=NULL){
					nodeList.Release();
					nodeList = NULL;
				}
				if(childNodePtr!=NULL){
					childNodePtr.Release();
					childNodePtr = NULL;					
				}
			}
			pXMLRootNode.Release();
			pXMLRootNode = NULL;	
		}
		catch (...) {
			return GETATTRIBUTEFAILURE;
		}
		return atoi(strValue) ;
	}
	else
		return INSTRUCTIONERROR;
}

int CReadXMLData::SetAnalyseState(int pos, int bIsAnalysed)
{
	if(!bIsInit) return INITXMLOBJECTFAILURE;
	ASSERT(pXMLDoc!=NULL);
	if(pos>0){	
		try{
			IXMLDOMElementPtr pXMLRootNode;		
			pXMLRootNode = IXMLDOMElementPtr(pXMLDoc->selectSingleNode("root"));
			if(pXMLRootNode!=NULL){
				IXMLDOMNamedNodeMapPtr pAttrs = NULL; 
				IXMLDOMNodePtr pAttrItem = NULL;				
				IXMLDOMNodeListPtr nodeList = pXMLRootNode->GetchildNodes();
				if(nodeList==NULL){
					pXMLRootNode.Release();
					pXMLRootNode = NULL;
					return FILEFORMATINVALID;
				}
				IXMLDOMNodePtr childNodePtr = NULL;
				DOMNodeType nodeType;
				long nCount = nodeList->length;
				if(nCount<=2){
					return XMLFORMATERROR;
				}
				long nCount_ = 0;
				CString strAttrName="";
				CString strAttrValue="";
				CString strAttributeInstru="";
				childNodePtr = nodeList->item[pos+1];
				if(childNodePtr!=NULL){
					childNodePtr->get_attributes(&pAttrs);
					pAttrs->get_length(&nCount_);
					nodeType = childNodePtr->nodeType;					
					if(nodeType == NODE_ELEMENT)
					{
						for(int j=0;j<nCount_;j++){
							pAttrs->get_item(j,&pAttrItem);
							strAttrName  = (char*)(_bstr_t)pAttrItem->nodeName;
							if(strAttrName.Compare("IsAnalysed")==0){
								CString tmp="";
								tmp.Format("%d",bIsAnalysed);
								pAttrItem->nodeValue = (LPCTSTR)tmp;
								break;
							}
						}
					}
				}
				else{
					return POSITIONNULL;
				}

				if(pAttrs!=NULL){
					pAttrs.Release();
					pAttrs = NULL; 
				}
				if(pAttrItem!=NULL){
					pAttrItem.Release();
					pAttrItem = NULL;					
				}
				if(pAttrItem!=NULL){
					nodeList.Release();
					nodeList = NULL;
				}
				if(childNodePtr!=NULL){
					childNodePtr.Release();
					childNodePtr = NULL;					
				}
			}
			pXMLRootNode.Release();
			pXMLRootNode = NULL;	
		}
		catch (...) {
			return GETATTRIBUTEFAILURE;
		}
		return SETSTATESUCCEEDED;
	}
	else
		return INSTRUCTIONERROR;
}

int CReadXMLData::Save()
{
	try{
	HRESULT hr;
	hr = pXMLDoc->save((char*)(_bstr_t)lpxmlFile);
	if(SUCCEEDED(hr))
		return 1;
	else
		return -1;
	}
	catch (...) {
		return -2;
	}

}

⌨️ 快捷键说明

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