最近在集成小程序,涉及到使用tinyxml类,在这里记录本次用于输出程序执行状态的代码,包括创建、添加信息、读取信息,exportXmlParam用于创建输出,addXmlevent用于主程序部分实时显示进程信息,ReadXmlParam用于读取xml文件。
(1)创建xml文件,因为本次要求输入数据在哪,输出结果文件必须在哪,故这里采用name表示输入数据的绝对地址参数
void CXMLReadfile::exportXmlParam(CString name) //name为读取参数的xml文件路径,需要创建一个xml用于显示程序进程
{
char infoxmlpath[128],*infoxmlname="\\exportinfo.xml";//输出文件为文件name的路径,名字为***
strcpy(infoxmlpath,name);//CString 转char*
PathRemoveFileSpec(infoxmlpath);//去除文件绝对路径里面的文件名字,只保留路径
strcat(infoxmlpath,infoxmlname);
TiXmlDocument *writeDoc = new TiXmlDocument; //xml文档指针
//文档格式声明
TiXmlDeclaration *decl = new TiXmlDeclaration("1.0", "gb2312", "yes");
//这里的gb2312将决定输出的格式,默认为ANSI,参考https://blog.csdn.net/hll127/article/details/6938767
//TiXmlDeclaration decl("1.0", "UTF-8", "yes");
writeDoc->LinkEndChild(decl); //写入文档
TiXmlElement *RootElement = new TiXmlElement("root");//根元素
//RootElement->SetAttribute(2); //属性
writeDoc->LinkEndChild(RootElement);
TiXmlElement *headnode = new TiXmlElement("head");//Stu
RootElement->LinkEndChild(headnode);//父节点写入文档
//程序名称
TiXmlElement *nameElement = new TiXmlElement("name");
headnode->LinkEndChild(nameElement);
TiXmlText *nameContent = new TiXmlText("sdmexe");
nameElement->LinkEndChild(nameContent);
//开始时间
time_t now; //实例化time_t结构
struct tm *timenow; //实例化tm结构指针
time(&now);//以下为获取时间
timenow = localtime(&now);
char buf[128]= {0};
strftime(buf, 64, "%Y-%m-%d %H:%M:%S", timenow);
TiXmlElement *strattimeElement = new TiXmlElement("starttime");
headnode->LinkEndChild(strattimeElement);
TiXmlText *starttimeContent = new TiXmlText(buf);
strattimeElement->LinkEndChild(starttimeContent);
//事件目录
TiXmlElement *contentnode = new TiXmlElement("content");//content
RootElement->LinkEndChild(contentnode);
//time函数读取现在的时间(国际标准时间非北京时间),然后传值给now
//log
TiXmlElement *scoreElement = new TiXmlElement("Log");
contentnode->LinkEndChild(scoreElement);
time(&now);
timenow = localtime(&now);
strftime(buf, 64, "%Y-%m-%d %H:%M:%S", timenow);
TiXmlText *localtimeContent = new TiXmlText(buf);
scoreElement->LinkEndChild(localtimeContent);
TiXmlText *score2Content = new TiXmlText(" 开始进程");
scoreElement->LinkEndChild(score2Content);
writeDoc->SaveFile(infoxmlpath);
delete writeDoc;
}
(2)数据插入,用于打开以上创建的初始xml文件,在程序运行到一定阶段时,调用该函数,向xml进程文件追加显示信息,如进行到读取xml文件参数导入,将“参数导入”四个字作为字符数组带入message参数中,name仍为以上(1)的输入数据地址。
void CXMLReadfile::addXmlevent(char message[128],CString name)
{
char buf[128]= {0};
time_t now; //实例化time_t结构
struct tm *timenow; //实例化tm结构指针
time(&now);
timenow = localtime(&now);
strftime(buf, 64, "%Y-%m-%d %H:%M:%S", timenow);
char infoxmlpath[128],*infoxmlname="\\exportinfo.xml";
strcpy(infoxmlpath,name);
PathRemoveFileSpec(infoxmlpath);
strcat(infoxmlpath,infoxmlname);
TiXmlDocument writeDoc(infoxmlpath); //根据路径获取整个文档
writeDoc.LoadFile();//下载xml文档呢
TiXmlElement* rootElement = writeDoc.RootElement(); //GeneralArgsConfig
if(rootElement==NULL)
AfxMessageBox("打不开XML文件,文件或为空,请检查");
//查找content节点
TiXmlElement* fileArgsElement=rootElement->FirstChildElement("content");
TiXmlElement *scoreElement = new TiXmlElement("Log");
fileArgsElement->LinkEndChild(scoreElement);
TiXmlText *localtimeContent = new TiXmlText(buf);
scoreElement->LinkEndChild(localtimeContent);
TiXmlText *score2Content = new TiXmlText(message);
scoreElement->LinkEndChild(score2Content);
writeDoc.SaveFile(infoxmlpath);
}
(3)数据读取,使用xml存储导入程序运行的参数及文件位置。
void CXMLReadfile::ReadXmlParam(const char* xmlpath)
{
arg1 d_arg;
TiXmlBase::SetCondenseWhiteSpace( false);
///加载xml
TiXmlDocument myDocument(xmlpath); //根据路径获取整个文档
myDocument.LoadFile();//下载xml文档呢
/*TiXmlDocument* myDocument = new TiXmlDocument();
myDocument->Parse(xmlpath);
myDocument->LoadFile();*/
加载根目录
TiXmlElement* rootElement = myDocument.RootElement(); //GeneralArgsConfig
if(rootElement==NULL)
AfxMessageBox("打不开XML文件,文件或为空,请检查");
/获取根目录下名为"fileArg"的节点
TiXmlElement* fileArgsElement = rootElement->FirstChildElement("fileArg"); //fileArg
if(fileArgsElement)
{
/获取"fileArg"的第一个子节点
TiXmlElement* argElement = fileArgsElement->FirstChildElement();
while ( argElement )
{
/获取argElement子节点的第一个属性(由于仅有一个属性,未用while)
TiXmlAttribute* attributeOffileArge = argElement->FirstAttribute();
d_arg.Aname=attributeOffileArge->Value();
/获取argElement子节点的第一个值 (由于仅有一个属性,未用while)
TiXmlElement* addressElement=argElement->FirstChildElement();
//d_arg.Avalue=addressElement->GetText();
d_arg.Avalue=ConvertUtf8ToGBK(addressElement->GetText());
Attrus.push_back(d_arg);
将argElement指向当前argElement节点的下一个节点
argElement=argElement->NextSiblingElement();
}
}
/获取根目录下名为"valueArg"的节点
TiXmlElement* valueArgsElement = rootElement->FirstChildElement("valueArg");//valueArg
if(valueArgsElement)
{
/获取"valueArg"的第一个子节点
TiXmlElement* argElement = valueArgsElement->FirstChildElement();
while(argElement)
{
/获取argElement子节点的第一个属性(由于仅有一个属性,未用while)
TiXmlAttribute* attributeOffileArge = argElement->FirstAttribute();
d_arg.Aname=attributeOffileArge->Value();
/获取argElement子节点的第一个值 (由于仅有一个值,未用while)
TiXmlElement* addressElement=argElement->FirstChildElement();
d_arg.Avalue=addressElement->GetText();
Attrus.push_back(d_arg);
将argElement指向当前argElement节点的下一个节点
argElement=argElement->NextSiblingElement();
}
}
}