关于日志二

LogViewer.cpp

#include  " StdAfx.h "
#include 
" .logviewer.h "





XMLLoader::XMLLoader(
void )
{
}


XMLLoader::
~ XMLLoader( void )
{
}


int  XMLLoader::loadFile(String fileName)
{
    MSXML2::IXMLDOMDocument2Ptr     xml;
    MSXML2::IXMLDOMElement          
*pDoc       = NULL;
    MSXML2::IXMLDOMNodeList         
*pChilds    = NULL;

    xml.CreateInstance(__uuidof(MSXML2::DOMDocument));
    assert( NULL 
!= xml );
    
if(!xml->load(fileName.c_str()))
    
{printf( " can not find file   please input correct file name ");assert(0);}

    xml
->get_documentElement(&pDoc);
    assert( NULL 
!= pDoc );
    MSXML2::IXMLDOMNodePtr root 
= pDoc;
    MSXML2::IXMLDOMNodeListPtr childs 
= pDoc->GetchildNodes();

    assert( NULL 
!= root );
    resetTree(mRoot);
    readNode(root, mRoot);

    xml.Release();
    
return 0;
}


int  XMLLoader::readNode(MSXML2::IXMLDOMNodePtr &  element, NodeItem &  node)
{
    VARIANT_BOOL v;
    v 
= element->hasChildNodes();
    _bstr_t name1    
= element->GetnodeName();
    _bstr_t text1    
= element->Gettext();
    
//BSTR    text2;    
    
//element->get_text(&text2);
    
//element->get_baseName(&text2);

    MSXML2::IXMLDOMNamedNodeMapPtr attr 
= element->Getattributes();

    
// Iterate all child nodes
    if (VARIANT_TRUE == v)
    
{
        MSXML2::IXMLDOMNodeList 
*pChilds = NULL;
        HRESULT hr 
= element->get_childNodes(&pChilds);

        
for (int i = 0; i < pChilds->Getlength(); i++)
        
{
            MSXML2::IXMLDOMNodePtr pChild 
= (MSXML2::IXMLDOMNodePtr)pChilds->item[i];
            NodeItem    child;
            readNode(pChild, child);
            node.mChildNodes.push_back(child);
        }

    }


    
// Retrieve attributes.
    if ( NULL != attr )
    
{
        
long lCount = 0;
        MSXML2::IXMLDOMNodePtr attrItem 
= NULL;
        HRESULT hr          
= attr->get_length(&lCount);
        
if!SUCCEEDED(hr) )
        
{
            
return FALSE;
        }

        
forint j = 0; j < lCount; j++ )
        
{                                   
            attr
->get_item(j,&attrItem);
            String   attrName  
= (LPCTSTR)(_bstr_t)attrItem->nodeName;
            String   attrValue 
= (LPCTSTR)(_bstr_t)attrItem->nodeTypedValue;
            NodeItem    child;
            child.mNodeName 
= attrName;
            child.mText 
= attrValue;
            node.mAttributes.push_back(child);
        }

    }

    
// Retrieve the node's node name and text.
    {
        _bstr_t name    
= element->GetnodeName();
        _bstr_t text    
= element->Gettext();
        node.mNodeName  
= name;
        node.mText      
= text;
    }

    
return 0;
}


int  XMLLoader::resetTree(NodeItem &  node)
{
    size_t     i 
= 0;
    node.mAttributes.clear();

    
for ( i = 0; i < node.mChildNodes.size(); i++ )
    
{
        resetTree(node.mChildNodes[i]);
    }

    node.mChildNodes.clear();
    
return 0;
}




LogViewer::LogViewer(
const  String xmlFileName)
{
     indent
=0;
     
this->loadFile(xmlFileName);
     
this->mRoot;
}


LogViewer::
~ LogViewer( void ) // 释放内存的树
{
    
//mRoot.mAttributes.clear();
    
//mRoot.mChildNodes.clear();    
}

bool   LogViewer::m_To_Html(String htmlfileName,String    LevelNodeName,String nodeName,String    nodetext,String attributeName,String attributeValue)
{
    std::fstream m_file;
    m_file.open(htmlfileName.c_str(),std::ios_base::
out);
    std::vector
<NodeItem*> result;
    findNode(result,mRoot,LevelNodeName,nodeName,nodetext,attributeName,attributeValue);
    
for (unsigned int i=0;i<result.size();i++)
    
{
        wirte_noe_html(
*(result[i]),m_file);
    }

    m_file.flush();
    m_file.close();
    
return true;
}

void     LogViewer::wirte_noe_html(NodeItem  & node,std::fstream  & file) // comman out no font size
{
    drawATable(indent,file);file
<<"<ul>"<<' ';indent++;            
    drawATable(indent,file);file
<<"<li>";file<<"<font face="Courier" size="2" color="#999999">"<<node.mNodeName<<" ";
    
//attributes;
    for(unsigned int i=0;i<node.mAttributes.size();i++)
    
{
        file
<<node.mAttributes[i].mNodeName<<""<<node.mAttributes[i].mText<<"  ";
    }

        
//if((node.mNodeName=="Message")||node.mNodeName=="IN_IMAGE"||node.mNodeName=="OUT_IMAGE")
    
//if((node.mChildNodes.size()<=1)&&(node.mChildNodes[0].mNodeName=="#text"))
        
//    file<<node.mText;
        file<<node.mChildNodes[0].mText;
        file
<<"</font>"<<"</li>"<<' ';
        file.flush();
    
for (unsigned int i=0;i<node.mChildNodes.size();i++)
    
{
        
if(node.mChildNodes[i].mNodeName!="#text")
        wirte_noe_html(node.mChildNodes[i],file);
    }
    
    
/*String name=node.mNodeName;
    if(name=="CONVERT")
    {
                            
    }else if(name=="Message")
    {
                        
    }
*/

    drawATable(indent,file);file
<<"</ul>"<<' ';indent--;
}

String    LogViewer::setFont(String face,String size,String color,String 
& str)
{
    String font
="<font ";
    
//if(face!="")
    
//font+="face="+face;
    
//if(size!="")
    
//    font+=" size="+size;
    
//if(color!="")
    
//    font+=" color="+""";//+color+""";
    
//font+=(">"+str+"</font>");
    return font;
}

bool  LogViewer::m_To_Excel(String excelFileName)
{    
    std::fstream m_file;
    m_file.open(excelFileName.c_str(),std::ios_base::
out);
    writeExcelHead(m_file);writeExcelStyles(m_file);indent
++;
    drawATable(indent,m_file);m_file
<<" <Worksheet ss:Name="Sheet1">"<<' ';indent++;
    parsingXML(mRoot,m_file);
    drawATable(indent,m_file);m_file
<<"</Worksheet>"<<" ";indent--;
    drawATable(indent,m_file);m_file
<<"</Workbook>"<<' ';;
    m_file.flush();
    m_file.close();
    
//std::vector<NodeItem*> result;
    
//findNode(result,mRoot,"CONVERT");
    
//int i=result.size();
    return true;
}

void     LogViewer::parsingXML(NodeItem  & node,std::fstream  & m_file) // 先实现一定的深度先
{
    
if(node.mNodeName=="CONVERTS")
    
{
        drawATable(indent,m_file);
        m_file
<<"<Table>"<<' ';indent++;
        setExcelWidth(m_file);
        
for(int i=0;i<node.mChildNodes.size();i++)
        
{
            NodeItem subNode
=node.mChildNodes[i];
            
if(subNode.mNodeName=="CONVERT")
            
{
                drawATable(indent,m_file);    m_file
<<"<Row>"<<' ';indent++;
                
for(int j=0;j<subNode.mChildNodes.size();j++)
                
{
                    
if((subNode.mChildNodes[j].mNodeName=="IN_IMAGE")||(subNode.mChildNodes[j].mNodeName=="OUT_IMAGE"))
                    
{
                        drawATable(indent,m_file);    m_file
<<"<Cell><Data ss:Type="String">"<<subNode.mChildNodes[j].mText<<"</Data></Cell>"<<" ";
                    }

                }

                String strERROR;findMessage(subNode,
"priority","ERROR",strERROR);
                String strWarning;findMessage(subNode,
"priority","WARNING",strWarning);
                
if(strERROR.length()>0)
                
{
                    drawATable(indent,m_file);    m_file
<<"<Cell><Data ss:Type="String">"<<"ERROR"<<"</Data></Cell>"<<" ";
                }
else if(strWarning.length()>0)
                
{
                    drawATable(indent,m_file);    m_file
<<"<Cell><Data ss:Type="String">"<<"WARNING"<<"</Data></Cell>"<<" ";
                }
else
                
{
                    drawATable(indent,m_file);    m_file
<<"<Cell><Data ss:Type="String">"<<"SUCCESS"<<"</Data></Cell>"<<" ";
                }

                drawATable(indent,m_file);    m_file
<<"<Cell><Data ss:Type="String">"<<strERROR+"  "+strWarning<<"</Data></Cell>"<<" ";


                
                drawATable(indent,m_file);m_file
<<"</Row>"<<' ';indent--;m_file.flush();
            }

        }

        drawATable(indent,m_file);
        m_file
<<"</Table>"<<' ';indent--;
    }
else
    
{
        
for(int i=0;i<node.mChildNodes.size();i++)
        
{
            parsingXML(node.mChildNodes[i],m_file);
        }

    }

}

void     LogViewer::findNode(std::vector < NodeItem *>      & resultNodes,NodeItem &  node,String    LevelNodeName,String nodeName,String    nodetext,String attribute,String    attributeValue)
{
    std::vector
<NodeItem*>    allNode;
    findNode(allNode,node,LevelNodeName);
    
for (unsigned int i=0;i<allNode.size();i++)
    
{
        
bool isMatch=false;
        isSubNodeMatch(
*(allNode[i]),isMatch,nodeName,nodetext,attribute,attributeValue);
        
if(isMatch||isNodeMatch(*(allNode[i]),nodeName,nodetext,attribute,attributeValue))
        
{
            resultNodes.push_back(allNode[i]);
        }

    }
    
}

bool     LogViewer::isNodeMatch(NodeItem  & node,String    nodeName,String text,String attribute,String attributeValue) // 单个node
{
    
bool result=false;
    
if(nodeName!="")
    
{
        
if(nodeName==node.mNodeName)
        
{        
            result
=true;
            
if((text!="")&&(node.mText!=text))
            
{        
                    
return false;            
            }

            
if(attribute!="")
            
{
                
for(unsigned i=0;i<node.mAttributes.size();i++)
                
{
                    
if(node.mAttributes[i].mNodeName!=attribute)
                    
{
                        
return false;
                    }
else
                    
{
                        
if((attributeValue!="")&&(node.mAttributes[i].mText!=attributeValue))
                            
return false;
                    }

                }

            }
//else if attribute=="" then attributeValue is not use
        }
else
            
return false;

    }
else
        
return true;
    
return result;
}

void     LogViewer::isSubNodeMatch(NodeItem  & INnode, bool   & outP,String    nodeName,String text,String attribute,String attributeValue)
{
    
for (unsigned i=0;i<INnode.mChildNodes.size();i++)
    
{
        outP
=isNodeMatch(INnode.mChildNodes[i],nodeName,text,attribute,attributeValue);
        
if(outP)return;
        
else
        isSubNodeMatch(INnode.mChildNodes[i],outP,nodeName,text,attribute,attributeValue);
    }

}

void     LogViewer::findNode(std::vector < NodeItem *>   & resultNodes,NodeItem &  node,String    LevelNodeName)
{
    
if(node.mNodeName==LevelNodeName)
    
{
        NodeItem 
*pNode=&node;
        resultNodes.push_back(pNode);
        
return;
    }
else//if not use else it will return all node which Node name is levelNodeName
    {
        
for(unsigned int i=0;i<node.mChildNodes.size();i++)
        
{
            findNode(resultNodes,node.mChildNodes[i],LevelNodeName);
        }


    }



}

bool     LogViewer::findMessage(NodeItem  & node,String attributeName,String attributeValue,String  & result)
{
     
static bool isfind=false;
    
for(int i=0;i<node.mAttributes.size();i++)//对当前的Node进行处理
    {
        
if((node.mAttributes[i].mNodeName==attributeName)&&(node.mAttributes[i].mText==attributeValue))
        
{result+="  "+node.mText;isfind=true;}
    }

    
for(int i=0;i<node.mChildNodes.size();i++)
    
{
        findMessage(node.mChildNodes[i],attributeName,attributeValue,result);
    }

    
return isfind;
}

void  LogViewer::drawATable( int  count,std::fstream  & m_file)
{
    
for(int i=0;i<count;i++)
        m_file
<<"    ";
}

void     LogViewer::writeExcelHead(std::fstream  & m_file)
{
    
    m_file
<<"<?xml version="1.0"?>"<<' ';
    m_file
<<"<?mso-application progid="Excel.Sheet"?>"<<' ';
    m_file
<<"<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet""<<' ';
    m_file
<<" xmlns:o="urn:schemas-microsoft-com:office:office""<<' ';
    m_file
<<" xmlns:x="urn:schemas-microsoft-com:office:excel""<<' ';
    m_file
<<" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet""<<' ';
    m_file
<<" xmlns:html="http://www.w3.org/TR/REC-html40">"<<' ';
    
}

void     LogViewer::writeExcelStyles(std::fstream  & m_file)
{
    m_file
<<"<Styles>"<<' '
          
<<"    <Style ss:ID="Default" ss:Name="Normal">"<<' '
          
<<"        <Alignment ss:Vertical="Bottom"/>"<<' '
          
<<"        <Borders/>"<<' '
          
<<"        <Font x:Family="Swiss"/>"<<' '
          
<<"        <Interior/>"<<' '
          
<<"        <NumberFormat/>"<<' '
          
<<"        <Protection/>"<<' '
          
<<"    </Style>"<<' '
          
<<"</Styles>"<<' ';
}

void     LogViewer::setExcelWidth(std::fstream  & m_file)
{
        drawATable(indent,m_file);m_file
<<"<Column ss:AutoFitWidth="0" ss:Width="171.75"/>"<<' ';
        drawATable(indent,m_file);m_file
<<"<Column ss:AutoFitWidth="0" ss:Width="171.75"/>"<<' ';
        drawATable(indent,m_file);m_file
<<"<Column ss:AutoFitWidth="0" ss:Width="50.75"/>"<<' ';
        drawATable(indent,m_file);m_file
<<"<Column ss:AutoFitWidth="0" ss:Width="340.75"/>"<<' ';
}

 

 LogManager

// LogManager.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "LogFile.h"
#include <iostream>
#include <fstream>
//#include <.h>
using namespace std;


#include "LogViewer.h"
int parsingArg(int argc,_TCHAR* argv[]);
void rotation(int i,int type)
{
 Log_TF("rotation");
 Log_Message(MES_PARAMETER,"the parameter is %d and %d ",i,type);
 Log_Message(MES_PARAMETER,"the parameter is %d and %d ");
 Log_Message(MES_WARNING,"it is a Warning");
 Log_Message(MES_ERROR,"it is a error");
}
void scale(int i)
{
 Log_TF("scale");
 Log_Message(MES_PARAMETER,"the parameter is %d  ",i);
 Log_Message(MES_PARAMETER,"the parameter is %d  ");
}
void flip(int i)
{
 Log_TF("flip");
 Log_Message(MES_PARAMETER,"the parameter is %d and ",i);
 Log_Message(MES_PARAMETER,"the parameter is %d  ");
}
void convertImage(String soucename,String destname)
{
 Log_TF("CONVERT");
 Log_Message(MES_INPUT_IMAGE,"%s",soucename.c_str());
 Log_Message(MES_OUTPUT_IMAGE," %s",destname.c_str());
 rotation(3,5);
 scale(3);
 flip(1);
}
void changesAll(void)
{
 //Log_TF("CONVERTS");
 Log_TFTOP;
 for(int i=0;i<1;i++)
 {
  //std::string souce=std::string(i);  
  convertImage("Image.bmp","DImage.png");
 }
 convertImage("Image.bmp","DImage.png");
}
class Test
{

public:int getValue(){return value;}
    Test(){value=9;}
protected:
private:
 int value;
 void b(){}
};
class Test2
{
public:void setValue(int v){value=v;}
protected:
private:int value;
  
};
class Test3: public Test
{
private:int value;
public:Test3(){value=0;}
 int a(){return Test::getValue(); //return Test::value;
 }
};
int _tmain(int argc, _TCHAR* argv[])
{
 
  CoInitialize(NULL);
  parsingArg(argc,argv);
 LogFile m_log;
 m_log.init("test.xml");
 //Log_Init("test.xml");
 //changesAll();
 //
 OutputDebugString("df/n");
 //printf("teat %d  %d %d %d",MES_PARAMETER,MES_OUTPUT_IMAGE,MES_ERROR,MES_WARNING);
 Log_Message("dfdfdf");
 //Log_Update();
 //Log_End();//关闭输出流
 //Log_XML_TO_EXCEL("Test.xml","testexcel.xml");
 //Log_XML_TO_HTML("test.xml","testhtml.html");
 m_log.pushStack("CONVERT");
 m_log.drawMessage(IMAGENAME,"dfdsf");
 m_log.drawMessage(PARAMETER,"the parameter is");
 m_log.popStack();
 flip(1);
 m_log.term();
 Test2 *test2=new Test2();
 test2->setValue(100);
 Test *test=(Test*)test2;
 Test3 *test3=new Test3();
 int c=test3->getValue();
 ///*LogViewer logviewer("test.xml");
 //logviewer.m_To_Excel("test2.xml");*/
 //
  CoUninitialize();
 return 0;
}
void printNote(void)
{
 cout<<"please input parameter like this: /n"
  <<"/t[xmlFileName] [htmlFileName] [levelNodeName] [nodeName] [attributeName] [attributeValue]/n"
  <<"/t please note: levelNodeName should not be a child of nodeName/n";
}
int parsingArg(int argc,_TCHAR* argv[])
{
 if(argc<=3||argc>=8)
 {
  printNote();
  return 0;
 }
 //判断文件格式
 //执行
 String parameters[7];
 for (int i=1;i<argc;i++)
 {
  parameters[i-1]=String(argv[i]);
 }
 for (int i=5;i>8-argc;i--)
 {
  parameters[i]="";
 }
 cout<<"the input Parameters are:"<<parameters[0]<<"/t "<<parameters[1]<<"/t "<<parameters[2]<<"/t "<<parameters[3]<<"/t "<<parameters[4]<<"/t "<<parameters[5]<<"/t "<<parameters[6];
 LogViewer logviewer(parameters[0]);
 //LogViewer logviewer("test.xml");
 logviewer.m_To_Html(parameters[1],parameters[2],parameters[3],parameters[4],parameters[5],parameters[6]);
 
 return 1;
}

/

LogManager::parsingArg()用于生成一个logviwer.exe 文件,这样就可以在命令行中把xml 文件 通过条件查询方式用html来显示.参数格式为:

[xmlfilename] [htmlfilename] [levelnodename] [nodename] [text] [attriburename] [attributevalue]

参数至不为三个,后面的可以不要。levelnaodename是指以多少深度来显示,以后的参数是条件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值