tinyxml创建、写入和读取

最近在集成小程序,涉及到使用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();
		}
	}
}
TinyXML是一个轻量级的C++库,用于读取写入XML文件。以下是一个简单的示例,演示如何使用TinyXML读取写入XML文件: 读取XML文件: ```c++ #include "tinyxml.h" int main() { TiXmlDocument doc("example.xml"); bool loadOkay = doc.LoadFile(); if (!loadOkay) { printf("Could not load file 'example.xml'. Error='%s'. Exiting.\n", doc.ErrorDesc()); return 1; } TiXmlElement* root = doc.FirstChildElement(); if (root == NULL) { printf("Failed to load file: No root element."); doc.Clear(); return 1; } TiXmlElement* element = root->FirstChildElement(); while (element != NULL) { const char* value = element->Value(); const char* text = element->GetText(); printf("%s: %s\n", value, text); element = element->NextSiblingElement(); } doc.Clear(); return 0; } ``` 这个示例假设存在一个名为example.xmlXML文件,并且它有一个根元素和一些子元素。程序读取XML文件并迭代每个子元素,打印其名称和文本内容。 写入XML文件: ```c++ #include "tinyxml.h" int main() { TiXmlDocument doc; TiXmlDeclaration* decl = new TiXmlDeclaration("1.0", "", ""); doc.LinkEndChild(decl); TiXmlElement* root = new TiXmlElement("root"); doc.LinkEndChild(root); TiXmlElement* element = new TiXmlElement("element"); element->LinkEndChild(new TiXmlText("text")); root->LinkEndChild(element); doc.SaveFile("example.xml"); return 0; } ``` 这个示例创建了一个新的XML文件,并在其中添加了一个根元素和一个子元素。最后,程序将XML文件保存到名为example.xml的文件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值