-
XML读与写
-
1.1 XML文档格式
- 1.1.1 XML, EXtensible Markup Language 可扩展标记语言。
- 1.1.2 XML声明
- 1.1.3 XML语法
- 1.1.3 XML的元素
-
二 以工程为例
- 2.1 XML的写入
- 2.1 XML的读取。
-
1.1 XML文档格式
实际上,XML的应用一般比较简单,还够不上 一个“语言”的级别。XML是一个数据格式,符合这种格式的文件后 缀名通常为*.xml 优点:可读性强! 缺点:解析费时、占用空间大、效率低!
1.1.2 XML声明XML文档的第一行必须是声明语句:例如,
version 版本号:总是1.0 encoding 文字编码:GBK, UTF-8等1.1.3 XML语法
<root> <host> nihao.cn host> <port> 1230 port> root>
简言之,XML文档是一个由元素构成的树型结 构。root,host, port都是元素
1.1.3 XML的元素示例:
"1001" page="1">qixiaofan... 1. 名称Name:必须配对!shaofashaofa
以下写法不对:
<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 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; inew 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 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讲解):传送门。
个人公众号: