XML读与写
1.1 XML文档格式
1.1.1 XML, EXtensible Markup Language 可扩展标记语言。
实际上,XML的应用一般比较简单,还够不上 一个“语言”的级别。XML是一个数据格式,符合这种格式的文件后 缀名通常为*.xml
优点:可读性强!
缺点:解析费时、占用空间大、效率低!
1.1.2 XML声明
XML文档的第一行必须是声明语句:例如,
<?xml version="1.0" encoding="GBK"?>
version 版本号:总是1.0
encoding 文字编码:GBK, UTF-8等
1.1.3 XML语法
<?xml version="1.0" encoding="GBK"?>
<root>
<host> nihao.cn </host>
<port> 1230 </port>
</root>
简言之,XML文档是一个由元素构成的树型结 构。root,host, port都是元素
1.1.3 XML的元素
示例:
<Contact id="1001" page="1">
<Name> qixiaofan </Name>
...
</Contact>
1. 名称Name:必须配对!
<Name> shaofa </Name>
<name> shaofa </name>
以下写法不对:
<NAME> qixiaofan </name>
NAME与name不配对
二 以工程为例
在此之前,先介绍一个很好用的库,tinyxml。
tinyxml: 一个小巧的xml库,可以生成和解析XML文档。免费开源,可以直接将源码加到项目中,适合多种平台。
可以从tinyxml作者的官网下载,传送门。
也可以从CSDN中下载 ,传送门。
2.1 XML的写入
目标写入的文件内容:
函数实现:
struct Note
{
int id;
char when[32];
char who[32];
char what[128];
};
vector<Note> notes;
int save()
{
TiXmlDocument xml_doc;
xml_doc.LinkEndChild(new TiXmlDeclaration( "1.0", "GBK", "" ));
TiXmlElement * xml_root = new TiXmlElement("root");
xml_doc.LinkEndChild(xml_root);
TiXmlElement* xml_NoteList = new TiXmlElement("NoteList");
xml_root->LinkEndChild(xml_NoteList);
// 添加host元素
for(int i=0; i<notes.size(); i++)
{
Note& r = notes[i];
TiXmlElement* xml_Note = new TiXmlElement("Note");
xml_NoteList->LinkEndChild(xml_Note);
AfTinyXml::addChild(xml_Note, "id", r.id);
AfTinyXml::addChild(xml_Note, "when", r.when);
AfTinyXml::addChild(xml_Note, "who", r.who);
AfTinyXml::addChild(xml_Note, "what", r.what);
}
//第一种方法:是将数据保存到本地
xml_doc.SaveFile("example02b.xml");
第二种方法:是将数据保存成string
//string txt;
//txt << xml_doc;
//cout << txt << endl;
return 0;
}
void addNote(int id, const char* when, const char* who, const char* what)
{
Note n;
n.id = id;
strcpy(n.when, when);
strcpy(n.who, who);
strcpy(n.what, what);
notes.push_back(n);
}
int main()
{
addNote(1, "2018-1-26 1:00", "Qi", "睡觉");
addNote(2, "2019-1-21 2:00", "Ge", "打豆豆");
addNote(3, "2020-2-20 5:00", "Yong", "看书");
save();
return 0;
}
2.1 XML的读取。
读取的文件和上述的写入文件一致。
函数实现如下:
struct Note
{
int id;
char when[32];
char who[32];
char what[128];
};
vector<Note> notes;
int main()
{
// 解析xml
TiXmlDocument xml_doc;
if(!xml_doc.LoadFile("example02b.xml"))
{
return -1;
}
// 根节点
TiXmlElement* xml_root = xml_doc.RootElement();
if (NULL == xml_root)
{
return -1;
}
// 获取元素的文本与属性
TiXmlElement* xml_NoteList = xml_root->FirstChildElement("NoteList");
if(xml_NoteList)
{
TiXmlElement* xml_Note = xml_NoteList->FirstChildElement("Note");
while(xml_Note)
{
// 取得子元素的文本
int id = AfTinyXml::childAsInt(xml_Note, "id");
string when = AfTinyXml::childAsText(xml_Note, "when");
string who = AfTinyXml::childAsText(xml_Note, "who");
string what = AfTinyXml::childAsText(xml_Note, "what");
// 保存到列表
Note r;
r.id = id;
strcpy(r.when, when.c_str());
strcpy(r.who, who.c_str());
strcpy(r.what, what.c_str());
notes.push_back(r);
// 下一个兄弟元素
xml_Note = xml_Note->NextSiblingElement("Note");
}
}
return 0;
}
至此,XML文件的简单用法便已经总结好了。对于更复杂的读入和写入操作,需要再进一步研究XML方可实现。
封装好的项目工程文件(包括读入和写入操作,以及XML文件的PPT讲解):传送门。
个人公众号: