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