利用XML文件的一个写日志的类!!!!!

2023-05-16

对于程序执行期间的错误跟踪!相信大家都有自己的一套办法!!!但都是利用文件文件,我这次利用的是XML&XSL,可产生报表格式的日志,轻松生成报表!!!

我参考了Emilio Guijarro Cameros的CXMLProfile写XML配置文件的思想!!!利用XML 接口IXMLDOMDocumentIXMLDOMNodeIXMLDOMElement和 MFC相结合,写成了一个CXMLLogfile类,只暴露了两个公共方法

 void Log(LPCTSTR lpszFilName,LPCTSTR s,...);
 bool ClearAll()

Log是添加一条日志,ClearAll是清除所有日志!!!当大家需要查看日值时,只需要打开相应的XML文件Log.XML就可以看到一个日志表格了,为此我专门写了一个XSL样式文件(XML样式XSL文件必须在XML文件同一目录下)!

以下是源代码,需要IE5.5以上支持!!!如果编译错误!请下载微软的最新XML SDK!!!!

 


 

// XMLLogfile.h: interface for the CXMLLogfile class.
//
//

#if !defined(AFX_XMLLOGFILE_H__EA8ACC84_7139_49F6_9B8A_F69D9CF5C385__INCLUDED_)
#define AFX_XMLLOGFILE_H__EA8ACC84_7139_49F6_9B8A_F69D9CF5C385__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include
#include
#include
#include
#include

//Author : By force eagle
//Date time : 2003-5-26 17:08
//reference :
//    CXMLProfile By Emilio Guijarro Cameros

#pragma comment(lib,"msxml2.lib")
class CXMLLogfile : public CObject 
{
 CString m_strFileName;
 IXMLDOMDocument *m_pXMLDoc;
 
 IXMLDOMNode * GetChildNode(LPCTSTR lpszParent, LPCTSTR lpszChild,BOOL bCreate = TRUE);
 IXMLDOMNode * GetFirstLevelNode(LPCTSTR lpszNodeName,BOOL bCreate = TRUE);

 // UNIX timestamp: seconds from 1970-01-01 00:00:00 (UTC)
 inline double TimeStamp(void)
 {
  _timeb ts;
  _ftime( &ts );
  return (int)ts.time + (ts.millitm/1000.0);
 };
protected:
 void AppendNode(IXMLDOMNode * pXMLItem, LPCTSTR lpszNodeName, LPCTSTR lpszValue);
 void AppendItem(LPCTSTR lpszFileName,LPCTSTR lpszComment);

 void Flush();

 bool CreateLogFile(LPCTSTR lpszLogFilName);

 void DumpComError(_com_error &e);

 void Init();


public:
 CXMLLogfile(LPCTSTR lpszFileName = NULL);
 virtual ~CXMLLogfile();
 void Log(LPCTSTR lpszFilName,LPCTSTR s,...);
 bool ClearAll();
};

#endif // !defined(AFX_XMLLOGFILE_H__EA8ACC84_7139_49F6_9B8A_F69D9CF5C385__INCLUDED_)

 


 

 

// XMLLogfile.cpp: implementation of the CXMLLogfile class.
//
//

#include "stdafx.h"
#include "XMLLogfile.h"

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

//
// Construction/Destruction
//
/*
static TCHAR *szLogOrig= {_T(" /n"
 " /n"
 "/nXXXX/n1053925276.381/n"
 "2003-05-26/n13:01:16.861/n/n")};
//*/
static WCHAR *wszLogOrig = {L" /n /n/nXXXX/n1053925276.381/n2003-05-26/n13:01:16.861/n/n"};

CXMLLogfile::CXMLLogfile(LPCTSTR lpszFileName)
{
 VARIANT_BOOL bResult;
 IXMLDOMElement *pRootNode;
 HRESULT hr;
 if (NULL == lpszFileName)
 {
  CString strHlpPath ,strAppName;
  strHlpPath = AfxGetApp()->m_pszHelpFilePath;
  strAppName = AfxGetAppName();
  strHlpPath = strHlpPath.Left(strHlpPath.GetLength() - 4
   - strAppName.GetLength());
  m_strFileName = strHlpPath + _T("LOG.XML");
 }
 else
 {
  m_strFileName = lpszFileName;
 }

 hr = CoInitialize(NULL);
LoadLog:
 if(SUCCEEDED(hr))
 {
  hr = CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER,
   IID_IXMLDOMDocument, (void**)&m_pXMLDoc);
  if(SUCCEEDED(hr))
  {
   m_pXMLDoc->load(COleVariant(m_strFileName), &bResult);
  }
 }

 //取得根节点
 m_pXMLDoc->get_documentElement(&pRootNode);

 if(pRootNode == NULL) //无根节点
 {
  m_pXMLDoc->Release();
  m_pXMLDoc = NULL;
  //重新创建XML日值文件
  CreateLogFile(m_strFileName);
  goto LoadLog; //重新载入
 }
 else
 {
  Init();
 }
}

CXMLLogfile::~CXMLLogfile()
{
 m_pXMLDoc->save(COleVariant(m_strFileName));
 m_pXMLDoc->Release();
}
/*
* 函数名称: Init()
* 说明:  初始化XML日志文件的工程信息
* 参数: 
*   无
* 返回: 无
*/
void CXMLLogfile::Init()
{
 IXMLDOMNode *pAppNameNode, *pTimestamp, *pDate, *pTime;;
 TCHAR        *szTemp = new TCHAR[MAX_PATH];
 HRESULT hr ;

 CTime timeCur ;
 timeCur = CTime::GetCurrentTime();
 CString strDate, strTime;
 strDate = timeCur.Format(_T("%Y-%m-%d"));
 strTime = timeCur.Format(_T("%X"));

 //更改工程名称
 pAppNameNode = GetFirstLevelNode(_T("AppName"));
 hr = pAppNameNode->put_text(CComBSTR(AfxGetAppName()));
 pAppNameNode->Release();
//* 
 //时间戳
 ZeroMemory(szTemp,MAX_PATH);
 double timestamp = TimeStamp();
 _stprintf(szTemp,_T("%.3f"),timestamp);
 pTimestamp = GetFirstLevelNode(_T("Timestamp"));
 hr = pTimestamp->put_text(CComBSTR(szTemp));
 pTimestamp->Release();
//*/
 //日期
 pDate = GetFirstLevelNode(_T("Date"));
 hr = pDate->put_text(CComBSTR(strDate));
 pDate->Release(); 

 //时间
 pTime = GetFirstLevelNode(_T("Time"));
 hr = pTime->put_text(CComBSTR(strTime));
 pTime->Release();

 delete szTemp;
 Flush();
}
/*
* 函数名称: DumpComError(_com_error &e)
* 说明:  输出COM错误信息
* 参数: 
*   IN  _com_error &e COM错误信息对象
* 返回: 无
*/
void CXMLLogfile::DumpComError(_com_error &e)
{
 _bstr_t bstrSource(e.Source());
 _bstr_t bstrDescription(e.Description());
 
 TRACE("Error/n");
 TRACE("/tCode = %08lx/n", e.Error());
 TRACE("/tCode meaning = %s/n", e.ErrorMessage());
 TRACE("/tSource = %s/n", (LPCSTR) bstrSource);
 TRACE("/tDescription = %s/n", (LPCSTR) bstrDescription);
}
/*
* 函数名称: CreateLogFile(LPCTSTR lpszLogFilName)
* 说明:  创建原始的XML日志文件
* 参数: 
*   IN  LPCTSTR lpszLogFileName 文件名称
* 返回: true 成功
*/
bool CXMLLogfile::CreateLogFile(LPCTSTR lpszLogFilName)
{
 IXMLDOMDocument *pXMLDoc = NULL;

 BSTR bstr = NULL;
 VARIANT_BOOL status;
 HRESULT hr;

 try
 {
  hr = CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER,
   IID_IXMLDOMDocument, (void**)&pXMLDoc);

  if (FAILED(hr))
   _com_issue_error(hr);

  bstr = ::SysAllocString(wszLogOrig);
  ASSERT(NULL != bstr);
  hr = pXMLDoc->loadXML(bstr,&status);
  ::SysFreeString(bstr);

  if (FAILED(hr))
   _com_issue_error(hr);

  if(status != VARIANT_TRUE)
  {
   return false;
  }

  hr = pXMLDoc->save(COleVariant(lpszLogFilName));
  if (FAILED(hr))
   _com_issue_error(hr);

  pXMLDoc->Release();
 }
 catch(_com_error &e)
 {
  DumpComError(e);
  return false;
 }
 return true;
}
/*
* 函数名称: GetFirstLevelNode(LPCTSTR lpszNodeName)
* 说明:  根据名称查找第一层子节点指针,没有则判断是否创建
* 参数: 
*   IN  LPCTSTR lpszNodeName 节点名称
*   IN  BOOL bCreate 是否创建
* 返回: IXMLDOMNode * 节点指针
*/
IXMLDOMNode * CXMLLogfile::GetFirstLevelNode(LPCTSTR lpszNodeName,BOOL bCreate)
{
 IXMLDOMElement *pRootNode = NULL, *element = NULL;
 IXMLDOMNode    *pLogItem = NULL, *pResultNode = NULL;
 CComBSTR       szName;
 bool           bSecFound = false, bEntryFound = false;
// wchar_t        *szTemp = new wchar_t[255];

 m_pXMLDoc->get_documentElement(&pRootNode);
 
 for(pRootNode->get_firstChild(&pLogItem); pLogItem != NULL; pLogItem->get_nextSibling(&pLogItem))
 {
  pLogItem->get_baseName(&szName);

  if(szName == CComBSTR(lpszNodeName))
  {
   pResultNode = pLogItem;
   break;
  }
 }

 if(pLogItem == NULL && bCreate)
 {
  m_pXMLDoc->createElement(CComBSTR(lpszNodeName), &element);
  pRootNode->appendChild(element, &pLogItem);
  element->Release();
  pResultNode = pLogItem;
 }

 pRootNode->Release();
 
 return pResultNode;
}
/*
* 函数名称: GetChildNode(LPCTSTR lpszParent, LPCTSTR lpszChild)
* 说明:  查找父节点下的某一子节点指针,没有则判断是否创建创建
* 参数: 
*   IN  LPCTSTR lpszParent 父节点名称
*   IN LPCTSTR lpszChild 子节点名称
*   IN  BOOL bCreate    是否创建
* 返回: IXMLDOMNode * 子节点指针
*/
IXMLDOMNode * CXMLLogfile::GetChildNode(LPCTSTR lpszParent, LPCTSTR lpszChild,BOOL bCreate)
{
 IXMLDOMElement *pRootNode= NULL, *element= NULL;
 IXMLDOMNode    *pLogItem= NULL, *pLogData= NULL, *pResultNode= NULL;
 CComBSTR       szName;

 m_pXMLDoc->get_documentElement(&pRootNode);
 
 for(pRootNode->get_firstChild(&pLogItem); pLogItem != NULL; pLogItem->get_nextSibling(&pLogItem))
 {
  pLogItem->get_baseName(&szName);

  if(szName == CComBSTR(lpszParent))
  {
   for(pLogItem->get_firstChild(&pLogData); pLogData != NULL; pLogData->get_nextSibling(&pLogData))
   {
    pLogData->get_baseName(&szName);

    if(szName == CComBSTR(lpszChild))
    {
     pResultNode = pLogData;    
     break;
    }
   }

   if(pLogData == NULL && bCreate)
   {
    m_pXMLDoc->createElement(CComBSTR(lpszChild), &element);
    pLogItem->appendChild(element, &pLogData);
    element->Release();
    pResultNode = pLogData;
   }
   pLogItem->Release();
   break;
  }
 }

 if(pLogItem == NULL && bCreate)
 {
  m_pXMLDoc->createElement(CComBSTR(lpszParent), &element);
  pRootNode->appendChild(element, &pLogItem);
  element->Release();
  m_pXMLDoc->createElement(CComBSTR(lpszChild), &element);
  pLogItem->appendChild(element, &pLogData);
  element->Release();
  pResultNode = pLogData;
 }
 
 pRootNode->Release();

 return pResultNode;
}
/*
* 函数名称: AppendNode(IXMLDOMNode * pXMLItem, LPCTSTR lpszNodeName, LPCTSTR lpszValue)
* 说明:  在XML中添加一节点,并赋值为 lpszValue
* 参数: 
*   IN  IXMLDOMNode * pXMLItem 要添加节点的节点指针
*   IN LPCTSTR lpszNodeName 添加的节点名称
*   IN  LPCTSTR lpszComment  值
*/
void CXMLLogfile::AppendNode(IXMLDOMNode * pXMLItem, LPCTSTR lpszNodeName, LPCTSTR lpszValue)
{
 IXMLDOMElement *element;
 IXMLDOMNode *pLogData;

 m_pXMLDoc->createElement(CComBSTR(lpszNodeName),&element);
 pXMLItem->appendChild(element,&pLogData);
 element->Release();

 pLogData->put_text(CComBSTR(lpszValue));
 pLogData->Release(); 
}
/*
* 函数名称: AppendItem(LPCTSTR lpszFileName,LPCTSTR lpszComment)
* 说明:  在XML中添加一条日志
* 参数: 
*   IN LPCTSTR lpszFileName 文件信息
*   IN  LPCTSTR lpszComment  错误信息
*/
void CXMLLogfile::AppendItem(LPCTSTR lpszFileName,LPCTSTR lpszComment)
{
 IXMLDOMElement *pRootNode, *element;
 IXMLDOMNode    *nLogItem;
 CComBSTR       szName;
 HRESULT hr;

 CTime timeCur ;
 timeCur = CTime::GetCurrentTime();
 CString strDate, strTime;
 strDate = timeCur.Format(_T("%Y-%m-%d"));
 strTime = timeCur.Format(_T("%X"));
 
 hr = m_pXMLDoc->get_documentElement(&pRootNode);

 m_pXMLDoc->createElement(CComBSTR(_T("LogItem")),&element);
 pRootNode->appendChild(element,&nLogItem);
 element->Release();

 AppendNode(nLogItem,_T("Date"),strDate);

 AppendNode(nLogItem,_T("Time"),strTime);

 AppendNode(nLogItem,_T("Filename"),lpszFileName);

 AppendNode(nLogItem,_T("comment"),lpszComment);


 pRootNode->Release();
}
/*
* 函数名称: Flush()
* 说明:  将缓冲区内数据写到磁盘保存XML文件
* 参数: 
*    无
*/
void CXMLLogfile::Flush()
{
 m_pXMLDoc->save(COleVariant(m_strFileName));
}
/*
* 函数名称: Log(LPCTSTR lpszFilName,LPCTSTR s,...)
* 说明:  添加一条日值记录
* 参数: 
*    LPCTSTR lpszFileName 文件信息
*    LPCTSTR s    其他错误信息
* EXAMPLE:
*   Log(__FILE__,"%ld line error!!",__LINE__)
*/
void CXMLLogfile::Log(LPCTSTR lpszFilName,LPCTSTR s,...)
{
 static TCHAR szBuff[1024];
 va_list argptr;
 int cnt;

 va_start(argptr, s);
 cnt = _vstprintf(szBuff, s, argptr);
 va_end(argptr);
 
 AppendItem(lpszFilName,szBuff);
 Flush();
}
/*
* 函数名称: ClearAll()
* 说明:  清除日值
* 参数: 
*    无
* 返回值:   成功 true
*/
bool CXMLLogfile::ClearAll()
{
 IXMLDOMElement *pRootNode= NULL;
 IXMLDOMNode    *pLogItem= NULL, *pLogData= NULL, *pOldNode= NULL, *pNextNode ,*pPreviousNode;
 CComBSTR       szName;
 HRESULT  hr ;
 m_pXMLDoc->get_documentElement(&pRootNode);
 try
 {
  pRootNode->get_lastChild(&pLogItem);
  do
  {
   pLogItem->get_previousSibling(&pPreviousNode);
    
   pLogItem->get_baseName(&szName);
   if(szName == CComBSTR(_T("LogItem")))
   {
    pLogItem->get_firstChild(&pLogData);
    do
    {
     pLogData->get_nextSibling(&pNextNode);

     pLogData->get_baseName(&szName);
     hr = pLogItem->removeChild(pLogData,&pOldNode);
     if (FAILED(hr))
      _com_issue_error(hr);
     pOldNode->Release();
     pOldNode = NULL;

     pLogData = pNextNode;
    }while(pLogData != NULL);
   }
   hr = pRootNode->removeChild(pLogItem,&pOldNode);

   if (FAILED(hr))
    _com_issue_error(hr);
   
   pLogItem = pPreviousNode;
  }while(pLogItem != NULL);
  pRootNode->Release();
 }
 catch(_com_error &e)
 {
  pRootNode->Release();
  DumpComError(e);
  return false;
 }
 Flush();
 return true;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用XML文件的一个写日志的类!!!!! 的相关文章

随机推荐

  • 单片机的程序具体运行过程以及栈空间的使用

    单片机的程序具体运行过程以及栈空间的使用 初始化RAM xff1a 将启动文件里选择的RAM空间清零 xff0c 将初始化不为零的全局变量在RAM里赋值 给PC指针赋初值 xff1a 将程序的第一条语句在ROM的地址取出给PC指针 程序执行
  • __block-内存管理

    我们创建一个对象如果我们block内部用到了 block类型的变量 xff0c 他会拥有这个对象 xff0c 我们可以通过cpp文件来分析 一旦访问对象 xff0c desc结构体里面就会多两个成员 xff0c 一个是copy 和dispo
  • 多线程 线程安全

    多线程的安全隐患 我们用多线程有很多好处 xff0c 但是也存在安全隐患 资源共享 1块资源可能会被多个线程共享 xff0c 也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象 同一个变量 同一个文件 当多个线程访问同一块资源时
  • IOS 推送通知 本地推送和远程推送

    什么是推送通知 首先明确 此处的推送通知跟我们的 NSNotification 没有半毛钱关系 可以理解为 向用户推送一条信息来通知用户某件事情 作用 可以在APP退到后台 或者关闭时 继续推送一条消息告诉用户某件事情 推送通知的应用场景
  • IOS Xcode用git管理我们的代码git的使用

    项目部署 xff0c 代码仓库 进入网站 创建项目 xff0c 2选择开源许可证的时候很关键 创建成功 然后找到 ssh https链接 用来认证 可以先用https不需要生成公钥和私钥 在终端cd到当前项目的文件夹 然后 使用 git c
  • Linux系统与设置命令

    2 系统与设置命令 在前面的两个章节中 xff0c 我们主要介绍了Linux基本知识和虚拟机的安装 xff0c 从当前章节开始 xff0c 我们一起学习下Linux的基本命令 xff0c 在当前章节 xff0c 我们先简单的学习下一些系统的
  • 4. iOS面试题原理篇2

    lldb gdb 常用的调试命令 xff1f po xff1a 打印对象 xff0c 会调用对象description方法 是print object的简写expr xff1a 可以在调试时动态执行指定表达式 xff0c 并将结果打印出来
  • SQL语言

    1 什么是SQL SQL structured query language xff1a 结构化查询语言 SQL是一种对关系型数据库中的数据进行定义和操作的语言 SQL语言简洁 xff0c 语法简单 xff0c 好学好用 什么是SQL语句
  • 实测:Ubuntu16.04 ROS中实现RVIZ控制驱动UR10E机械臂!

    踩过了太多的坑 xff0c 此博客警醒自己 xff01 能用的收藏一下 一 演示一切之前 xff0c 要清楚两个问题 xff1a 1 你的UR是什么型号 xff0c 示教器软件版本是什么 xff1f xff08 这个不会看的话 xff0c
  • STM32CubeMX安装及使用教程(一)

    背景 随着芯片行业不断发展 xff0c STM32系列芯片不断扩大市场份额 为了方便开发者的不同需求 xff0c 意法半导体 xff08 ST xff09 推出了一款图形化配置工具 STM32CubeMX STM32CubeMX可以通过图形
  • STM32CubeMX安装及使用教程(二)

    背景 第一章我们讲述了如何安装和配置STM32CubeMX软件 xff0c 这一章我们来说说如何简单的使用STM32CubeMX软件 软件使用 1 打开STM32CubeMX软件 xff0c 点击File gt New Project 2
  • xshell无法连接虚拟机中的ubuntu解决方案

    xshell无法连接虚拟机中的ubuntu解决方案 查看虚拟机中ubuntu的IP地址的方法 ifconfig a 利用xshell工具进行远程连接 ssh IP地址 发现无法连接 xff0c 这就是我一开始将VM安装好 xff0c 一次性
  • 气压计融合定高控制逻辑

  • Git简介

    什么是版本控制 学习Git之前首先要了解一个概念 版本控制 xff0c 什么是版本控制 xff0c 版本控制就是一种在开发的过程中用于管理我们对文件 目录或工程等内容的修改历史 xff0c 方便查看更改历史记录 xff0c 备份以便恢复以前
  • Git图形化管理工具Sourcetree的使用及git冲突问题

    目录 一 了解 Sourcetree1 什么是Sourcetree2 为什么要使用Sourcetree 二 Sourcetree下载与安装1 下载2 安装 三 Sourcetree的使用1 Gitee的介绍与使用什么是GiteeGitee的
  • [智能车]平衡车/直立车的入门经验(代码讲解)

    做为第十六届智能车的FW 在半年的做车经历中把能踩的坑都踩了个遍 写这篇文章是为了留个纪念 xff0c 也是为了帮新车友快速入门 xff08 可能完全0基础 xff09 我自己的经验也不足 xff0c 所以可能会存在一些漏洞 xff0c 还
  • Mac系统 dockerfile 报错 COPY failed: stat /var/lib/docker/tmp/docker-builderxxx

    报错 xff1a Step 3 4 span class token keyword span COPY nginx 1 12 2 tar gz usr local src COPY failed span class token func
  • VS code的git设置

    先建立一个空文件夹 在git窗口先点 初始化仓库 xff0c 再点侧边栏右上角的 更多 xff0c 选 远程 下的 添加远程存储仓库 输入远程仓库地址 xff0c 再输入仓库名称 打开 源代码管理存储库 视图 xff0c 点上面的git分支
  • L4Linux的版本比较

  • 利用XML文件的一个写日志的类!!!!!

    对于程序执行期间的错误跟踪 xff01 相信大家都有自己的一套办法 xff01 xff01 xff01 但都是利用文件文件 xff0c 我这次利用的是XML amp XSL xff0c 可产生报表格式的日志 轻松生成报表 xff01 xff