一:XML简介
目录
XML--可扩展标记语言(可扩展标记语言(Extensible Markup Language)的缩写,与HTML语言相比倾向于数据结构,而不是网页结构。科班出身的我简要介绍一下广义的数据结构这个词,一切可以被计算机识别的文字,数字,标记,符号,字母等都可以被称为数据,结构则是数据的表现形式,数据结构组合在一起就是数据与数据之间的关系,包括表现(逻辑),存储等关系。XML文件就是以.xml为后缀的文件,右键文件编辑可以查看此类文件的内容,如下图所示
DOM解析(DOM:Document Object Model,文档对象模型)简述一下就是将XML文件内容看做一层一层树形结构并解析成为一个对象,既然是一个对象那么就可以随机访存。虽然这种方式对于简单的XML文件的读写十分方便,但是当XML文件复杂起来,计算机在内存中创建的树对象占用空间也随之变大,缺点也就随之而来,树的结构越复杂,对内存的要求越高,同时便利操作也越耗时。
当然也有另一种解析方式(SAX Simple API for XML ),这种方式边扫描边解析
再讲讲XML文件在程序中的作用,可以将应用程序启动时初始化的参数放在其中,这样的话在程序代码层更加普适且利于维护。
二: 读写准备
1 下载DMO方式解析XML工具 tinyxml 官网 :TinyXML download | SourceForge.net
下载后解压后的画面如下,图中画圈部分即是需要用到的工具
2 创建VS 控制台应用,当然MFC也可以。将以上文件拷贝到你的项目路径下,并添加引用或头文件
3 在项目中添加现有项,这里有个问题就是如果没有将上述对应的文件拷贝到项目路径下而直接添加解压后路径下的文件会导致引用头文件因找不到而报错,这可能是个bug,而且就算再拷贝过去也会报错。需要将已经添加现有项删除掉重新添加。
三:创建XML文件
//****************一 : 创建XML文件******************
//创建XML对象
TiXmlDocument* tiDoc = new TiXmlDocument();
if (!tiDoc)
{
cout << "创建XML对象失败" << endl;
return -1;
}
//创建头部声明信息 版本 编码格式 保留字符串,空串即可
TiXmlDeclaration * tiDec = new TiXmlDeclaration("1.0", "utf-8", "");
if (!tiDec)
{
cout << "创建XML头部声明失败" << endl;
return -1;
}
//将XML头部说明插入到文档中
tiDoc->LinkEndChild(tiDec);
//创建根节点
TiXmlElement* root = new TiXmlElement("root");
//插入到文档中
tiDoc->LinkEndChild(root);
//为root创建子节点info
TiXmlElement* info = new TiXmlElement("info");
//为info节点添加属性
info->SetAttribute("id", 1);
info->SetAttribute("type", "人物信息");
//为info创建子节点name
TiXmlElement* name =new TiXmlElement("name");
//为name节点添加文字
TiXmlText* Name = new TiXmlText("SGYT");
name->LinkEndChild(Name);
//为info节点创建子节点age
TiXmlElement* age = new TiXmlElement("age");
TiXmlText* Age = new TiXmlText("24");
age->LinkEndChild(Age);
//info节点创建子节点tall
TiXmlElement* tall = new TiXmlElement("tall");
TiXmlText* Tall = new TiXmlText("174");
tall->LinkEndChild(Tall);
//将name age tall 三个节点连接到info节点上
info->LinkEndChild(name);
info->LinkEndChild(age);
info->LinkEndChild(tall);
//将root的子节点info插入到文档中
root->LinkEndChild(info);
bool res = tiDoc->SaveFile("创建xml示例.xml");
if (res == true)
{
cout << "创建成功" << endl;
tiDoc->Print();//在控制台打印
return 0;
}
else
{
cout << "创建失败" << endl;
}
//****************一 : 创建XML文件 end******************
四:读xml
//********************二 :读取节点************************************
//创建xml文档对象
TiXmlDocument doc("创建xml示例.xml");
//加载文档
bool loadOK = doc.LoadFile();
if (!loadOK)
{
cout << "xml文件加载失败" << endl;
return 0;
}
//读取xml头部声明
TiXmlDeclaration* tiDec = doc.FirstChild()->ToDeclaration();
if (tiDec!=NULL)
{
cout << "version:" << tiDec->Version()<<" ";
cout << "encoding:" << tiDec->Encoding() << endl;
}
//获取根元素
TiXmlElement* rootElem = doc.RootElement();
//遍历读
TiXmlElement* temp = rootElem;
for (TiXmlElement* moveElem = temp->FirstChildElement(); moveElem; moveElem = moveElem->NextSiblingElement()) //NextSiblingElement()寻找兄弟节点 参数可以设置兄弟节点字符串
for(TiXmlElement * child=moveElem->FirstChildElement();child;child=child->NextSiblingElement())
cout << child->Value()<<" : "<<child->GetText()<< endl; //获取节点名与节点值
//随机读
cout << "==========随机读===========" << endl;
temp = rootElem;
TiXmlElement* readA = temp->FirstChildElement("info");
TiXmlElement* child = readA->FirstChildElement("age");
cout << child->Value() << " : " << child->GetText() << endl;
//********************二 :读取节点 end************************************
五:写XML
/*****************三 : 写xml *******************************/
TiXmlDocument doc("创建xml示例.xml");
bool loadOK = doc.LoadFile();
if (!loadOK)
{
cout << "加载xml失败" << endl;
return 0;
}
TiXmlElement* rootElement = doc.RootElement();
TiXmlElement* temp = rootElement;
//修改id属性为1的节点中tall节点的值为175 并修改id属性为2
//这里可以遍历xml文件找 如果节点唯一的话可以直接访问
TiXmlElement* info = temp->FirstChildElement("info");
cout << info->Attribute("id") << endl;
if (strcmp(info->Attribute("id"),"1") == 0) //也可以用strcmp
{
info->SetAttribute("id", "2");
TiXmlElement* tall = info->FirstChildElement("tall");
TiXmlNode* node = tall->FirstChild();
node->SetValue("175");
}
doc.SaveFile();
/*****************三:写xml end*****************************/