📄 storexmldata.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 + -