今天做的任务需要我把一种类似树的数据存储起来并读取,最开始想要使用ini文件,但是一方面由于Ini文件主要用来保存配置,用它来存储大量数据感觉不太好。。。而且我要存储的数据结构是多层的多叉树,用ini存储很难定义结构,最后还是决定使用XML。
一、XML文件结构
XML文件的结构性内容,包括节点关系以及属性内容等等。
元素是组成XML的最基本的单位,它由开始标记,属性和结束标记组成。
就是一个元素的例子,每个元素必须有一个元素名,元素可以若干个属性以及属性值。
一个xml文件的例子
例
〈?xml version="1.0" encoding="gb2312" ?〉
〈学生资料〉
〈学生〉
〈名字〉李四〈/名字〉
〈身份〉学生〈/身份〉
〈年龄 虚实岁="实"〉20.00〈/年龄〉
〈/学生〉
〈/学生资料〉
第一行是 XML 声明。它定义 XML 的版本 (1.0) 和所使用的编码 (ISO-8859-1 = Latin-1/西欧字符集)。
下一行描述文档的根元素(像在说:“本文档是一个便签”):学生资料
接下来 描述根的 子元素:学生,最后一行定义根元素的结尾;
XML 文档形成一种树结构
XML 文档必须包含根元素。该元素是所有其他元素的父元素。
XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。
所有元素均可拥有子元素:
父、子以及同胞等术语用于描述元素之间的关系。父元素拥有子元素。相同层级上的子元素成为同胞(兄弟或姐妹)。
所有元素均可拥有文本内容和属性(类似 HTML 中)。
二、C++读写XML文件(使用tinyxml库)
使用以下代码之前,需要下载TinyXml库,并包含到工程下,只需要包含tinystr.cpp tinystr.h tinyxml.cpp tinyxml.h tinyxmlerror.cpp tinyxmlparser.cpp 就可以了
(https://download.csdn.net/download/ll596214569/10782791 这是个tinyXML库,没有积分的就自己去百度网盘找吧。。。)
(https://download.csdn.net/download/ll596214569/10782898 这是我学习的时候写的一个练手的小程序,有兴趣的可以看下)
tinyXML的使用也极为简单,其中封装好了大多数相关的操作,只需要看一下源码直接调用就好了,我上传了一个使用的案例,等审核过了我把链接粘过来。
想了想还是贴下代码吧,毕竟下载也是要积分的。。
int CReadXML::writeXmlFile()
{
TiXmlDocument *writeDoc = new TiXmlDocument; //xml文档指针
int n = 3;
TiXmlElement *RootElement = new TiXmlElement("Factor");//根元素
RootElement->SetAttribute("num", n); //属性
writeDoc->LinkEndChild(RootElement);
char* str1[20] = {"股票价格","成交额","成交量","股票涨幅","股票相对涨幅","累计换手率",
"涨跌停标记","股本和市值","资金净流入","融资融券","港资持股","日内行情","15分钟行情","新股指标"};
char* str2[20] = {"WQ价格类","WQ量价类","WQ二分类","乖离率","波动率","MA",
"成交量形态","K线形态","EMA","MACD","TRIX","KDJ","RSI","相对波动率"};
char* str3[20] = {"估值","清偿能力","资本结构","营利能力","资本效率","营运效率",
"成长能力","研发投入","每股指标","最近一年合计TTM","市值行业中性","业绩评分"};
for (int i = 0; i<n; i++)//n个父节点
{
TiXmlElement* StuElement = new TiXmlElement("Tree");
//设置属性
if(i%3 == 0)
{
StuElement->SetAttribute("class", "行情");
StuElement->SetAttribute("id", "GPJG");
RootElement->LinkEndChild(StuElement);
for(int i = 0;i != 14;++i)
{
const char* ch = str1[i];
TiXmlElement *scoreElement = new TiXmlElement(ch);
StuElement->LinkEndChild(scoreElement);
}
}
else if (1 == i%3)
{
StuElement->SetAttribute("class", "技术指标");
StuElement->SetAttribute("id", "WQJGL");
RootElement->LinkEndChild(StuElement);
for(int i = 0;i != 14;++i)
{
const char* ch = str2[i];
TiXmlElement *scoreElement = new TiXmlElement(ch);
StuElement->LinkEndChild(scoreElement);
}
}
else if (2 == i%3)
{
StuElement->SetAttribute("class", "财务指标");
StuElement->SetAttribute("id", "GZ");
RootElement->LinkEndChild(StuElement);
for(int i = 0;i != 12;++i)
{
const char* ch = str3[i];
TiXmlElement *scoreElement = new TiXmlElement(ch);
StuElement->LinkEndChild(scoreElement);
}
}
}
CString csXmlFileName = _T("");
csXmlFileName.Format(_T("%s\\%s.xml"), _T("G:"), _T("testt") );
CStringA tempFile(csXmlFileName);
writeDoc->SaveFile(tempFile.GetBuffer());
tempFile.ReleaseBuffer();
delete writeDoc;
return 1;
}
上面这段代码,我在G盘创建了一个名为testt.xml的文件,然后把三个字符数组存了进去;
//解析xml文件
int CReadXML::readXmlFile()
{
char *path = "G:\\testt.xml";
TiXmlDocument mydoc(path);//xml文档对象
bool loadOk = mydoc.LoadFile();//加载文档
if (!loadOk)
{
cout << "could not load the test file.Error:" << mydoc.ErrorDesc() << endl;
exit(1);
}
TiXmlElement *RootElement = mydoc.RootElement(); //根元素, Info
cout << "[root name]" << RootElement->Value() << "\n";
TiXmlElement *pEle = RootElement;
//遍历该结点
for (TiXmlElement *StuElement = pEle->FirstChildElement();//第一个子元素
StuElement != NULL;
StuElement = StuElement->NextSiblingElement())//下一个兄弟元素
{
cout << StuElement->Value() << " ";
TiXmlAttribute *pAttr = StuElement->FirstAttribute();//第一个属性
while (NULL != pAttr) //输出所有属性
{
cout << pAttr->Name() << ":" << pAttr->Value() << " ";
pAttr = pAttr->Next();
}
cout << endl;
//输出子元素的值
for (TiXmlElement *sonElement = StuElement->FirstChildElement();
sonElement;
sonElement = sonElement->NextSiblingElement())
{
cout << sonElement->Value() << endl;
}
}
return 1;
}
上面这段代码是对应读取上上面写好的XML文件。
还有参考文献:
https://blog.csdn.net/u014080185/article/details/78688328
https://www.cnblogs.com/time-is-life/p/5671872.html
https://www.cnblogs.com/Bo-tree/articles/5071998.html
http://www.w3school.com.cn/xml/xml_tree.asp