今天突然需要用到文本协议,以前搞嵌入式的东西,都是用的二进制协议,没有用到文本协议,今天开始学习了一上午,感觉文本协议确实在制定上要方便了很多。但是效率上肯定不如二进制协议,但是二进制协议对于维护者来说还是比较困难的。
首先说说XML吧,下面说说我的简单理解,(具体的参考教程http://www.runoob.com/xml/xml-tutorial.html )
XML是可扩展标记语言,是(eXtensible Markup Language)的缩写。XML用来传输数据和存储数据。
也就是说XML的基本概念,我们学什么东西都要从其概念入手:
using namespace std;
#include <iostream>
#include "tinyxml.h"
#include "tinystr.h"
#include <string>
#include <windows.h>
#include <atlstr.h>
using namespace std;
string GetAppPath()
{//获取应用程序目录
char moduleFileName[MAX_PATH];
GetModuleFileNameA(NULL, moduleFileName, MAX_PATH);
std::string workingFolder(moduleFileName);
size_t pos = workingFolder.find_last_of("\\");
workingFolder = workingFolder.substr(0, pos);
std::cout << workingFolder << std::endl;
return workingFolder;
}
bool CreateXmlFile(string& szFileName)
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
try
{
//创建一个XML的文档对象。
TiXmlDocument *myDocument = new TiXmlDocument();
//创建一个根元素并连接。
TiXmlElement *RootElement = new TiXmlElement("Persons");
myDocument->LinkEndChild(RootElement);//根元素连接到myDocument下。
//创建一个Person元素并连接。
TiXmlElement *PersonElement = new TiXmlElement("Person");
RootElement->LinkEndChild(PersonElement);//原来是连接这里有文章啊,哈哈
//设置Person元素的属性。
PersonElement->SetAttribute("ID", "1");
//创建name元素、age元素并连接。
TiXmlElement *NameElement = new TiXmlElement("name");
TiXmlElement *AgeElement = new TiXmlElement("age");
PersonElement->LinkEndChild(NameElement);
PersonElement->LinkEndChild(AgeElement);
//设置name元素和age元素的内容并连接。
TiXmlText *NameContent = new TiXmlText("麦蒂");
TiXmlText *AgeContent = new TiXmlText("32");
NameElement->LinkEndChild(NameContent);
AgeElement->LinkEndChild(AgeContent);
TiXmlElement *PersonElement1 = new TiXmlElement("Person");
RootElement->LinkEndChild(PersonElement1);//原来是连接这里有文章啊,哈哈
//设置Person元素的属性。
PersonElement1->SetAttribute("ID", "2");
//创建name元素、age元素并连接。
TiXmlElement *NameElement1 = new TiXmlElement("name");
TiXmlElement *AgeElement1 = new TiXmlElement("age");
PersonElement1->LinkEndChild(NameElement1);
PersonElement1->LinkEndChild(AgeElement1);
//设置name元素和age元素的内容并连接。
TiXmlText *NameContent1 = new TiXmlText("易建联");
TiXmlText *AgeContent1 = new TiXmlText("28");
NameElement1->LinkEndChild(NameContent1);
AgeElement1->LinkEndChild(AgeContent1);
TiXmlElement *PersonElement3 = new TiXmlElement("Person");
RootElement->LinkEndChild(PersonElement3);//原来是连接这里有文章啊,哈哈
//设置Person元素的属性。
PersonElement3->SetAttribute("ID", "3");
//创建name元素、age元素并连接。
TiXmlElement *NameElement3 = new TiXmlElement("name");
TiXmlElement *AgeElement3 = new TiXmlElement("age");
PersonElement3->LinkEndChild(NameElement3);
PersonElement3->LinkEndChild(AgeElement3);
//设置name元素和age元素的内容并连接。
TiXmlText *NameContent3 = new TiXmlText("姚明");
TiXmlText *AgeContent3 = new TiXmlText("32");
NameElement3->LinkEndChild(NameContent3);
AgeElement3->LinkEndChild(AgeContent3);
string appPath = GetAppPath();
string seperator = "\\";
string fullPath = appPath + seperator + szFileName;
myDocument->SaveFile(fullPath.c_str());//保存到文件
}
catch (string& e)
{
return false;
}
return true;
}
bool ReadXmlFile(string& szFileName)
{//读取Xml文件,并遍历
try
{
string appPath = GetAppPath();
string seperator = "\\";
string fullPath = appPath + seperator + szFileName;
//创建一个XML的文档对象。
TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());
if (NULL == myDocument)
{
return false;
}
myDocument->LoadFile();
//获得根元素,即Persons。
TiXmlElement *RootElement = myDocument->RootElement();
if (NULL == RootElement)
{
return false;
}
//输出根元素名称,即输出Persons。
cout << RootElement->Value() << endl;
//获得第一个Person节点。
TiXmlElement *FirstPerson = RootElement->FirstChildElement();
//获得第一个Person的name节点和age节点和ID属性。
TiXmlElement *NameElement = FirstPerson->FirstChildElement();
TiXmlElement *AgeElement = NameElement->NextSiblingElement();
TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
//输出第一个Person的name内容,即周星星;age内容,即 22;ID属性,即ID="1"
cout << NameElement->FirstChild()->Value() << endl;
cout << AgeElement->FirstChild->Value() << endl;
cout << IDAttribute->Value() << endl;
}
catch (string& e)
{
return false;
}
return true;
}
int main()
{
string fileName = "info.xml";
CreateXmlFile(fileName);
ReadXmlFile(fileName);
}