~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 + -
显示快捷键?