我们使用tinyxml库,生成和解析XML文档。
他是一个小巧的xml库,可以生成和解析xml文档,免费开源,可以直接将源码加载到项目中,适合多种平台。
我们使用tinyxml v1版本。
下载地址:https://sourceforge.net/projects/tinyxml/
把他解压后放到项目的文件夹下
这就是他的所有文件了
在你的项目内新建一个文件筛选器,名为tinyxml,之后把这些文件都添加进去。
这样就配置好了,我们怎么使用呢?
我们首先建立一个这样的代码,一切操作都在test1内进行。
记得声明tinyml.h的头文件
#include "tinyxml/tinyxml.h" //声明头文件
#include <string>
#include <Windows.h>
int test1()
{
return 0;
}
int main()
{
test1();
system("pause");
return 0;
}
构造一个xml类,让他有声明和root根元素
int test1()
{
TiXmlDocument xml_doc; //构造xml文件类
xml_doc.LinkEndChild(new TiXmlDeclaration("1.0", "GBK", "")); //添加XML声明
TiXmlElement* xml_root = new TiXmlElement("root"); //构造根元素
xml_doc.LinkEndChild(xml_root); //把根元素添加进xml_doc里
//对于以上代码做一个小说明:LinkEndChild可以链接声明,也可以链接元素。
xml_doc.SaveFile("xml_doc.xml"); //这样就可以输出啦
return 0;
}
首先使用TiXmlDocument构造xml文件类,即代码中 xml_doc。
然后使用使用xml_doc的LinkEndChild类函数,链接new出来的TiXmlDeclaration声明类,给他声明部分。
然后使用TiXmlElement构造元素类,即代码中xml_root,他是根元素。
也是用LinkEndChild,链接到xml_doc即可。
<?xml version="1.0" encoding="GBK" ?>
<root />
虽然看起来不太对,"root"没有成对出现,这是因为我们还没有添加元素。
int test1()
{
TiXmlDocument xml_doc; //构造xml文件类
xml_doc.LinkEndChild(new TiXmlDeclaration("1.0", "GBK", "")); //添加XML声明
TiXmlElement* xml_root = new TiXmlElement("root"); //构造根元素
xml_doc.LinkEndChild(xml_root); //把根元素添加进xml_doc里
//对于以上代码做一个小说明:LinkEndChild可以链接声明,也可以链接元素。
//----------------新----加----入----的----代----码--------------------------------
TiXmlElement* xml_child = new TiXmlElement("host");//创建名为host一个元素
xml_root->LinkEndChild(xml_child);//把这个元素添加进root根元素
xml_child->LinkEndChild(new TiXmlText("www.baidu.com"));//给这个元素添加数据
//下边两行代码,是给这个元素添加属性
xml_child->SetAttribute("checked", "true");
xml_child->SetAttribute("station", 1001);
//对于以上代码做一个小说明:元素类为TiXmlElement,元素数据类为TiXmlText,设置元素属性函数为SetAttribute。使用方法请仔细阅读代码
xml_doc.SaveFile("xml_doc.xml");保存文件
return 0;
}
和创建root元素一样的类创建xml_child元素。
使用xml_doc的类函数LinkEndChild把新建的xml_child链接进来。
向xml_child添加数据。
SetAttribute即可向xml_child添加属性。
<?xml version="1.0" encoding="GBK" ?>
<root>
<host checked="true" station="1001">www.baidu.com</host>
</root>
效果看起来不错。
演示一下元素嵌套
int test1()
{
TiXmlDocument xml_doc; //构造xml文件类
xml_doc.LinkEndChild(new TiXmlDeclaration("1.0", "GBK", "")); //添加XML声明
TiXmlElement* xml_root = new TiXmlElement("root"); //构造根元素
xml_doc.LinkEndChild(xml_root); //把根元素添加进xml_doc里
//对于以上代码做一个小说明:LinkEndChild可以链接声明,也可以链接元素。
TiXmlElement* xml_child = new TiXmlElement("host");//创建名为host一个元素
xml_root->LinkEndChild(xml_child);//把这个元素添加进root根元素
xml_child->LinkEndChild(new TiXmlText("www.baidu.com"));//给这个元素添加数据
//下边两行代码,是给这个元素添加属性
xml_child->SetAttribute("checked", "true");
xml_child->SetAttribute("station", 1001);
TiXmlElement* xml_client = new TiXmlElement("client"); //嵌套元素
xml_root->LinkEndChild(xml_client);
TiXmlElement* xml_name = new TiXmlElement("name"); //仔细阅读一下,不过是把new的元素,连接到xml_client而已
xml_name->LinkEndChild(new TiXmlText("余生皆假期"));
xml_client->LinkEndChild(xml_name);
//同上
TiXmlElement* xml_id = new TiXmlElement("id");
xml_id->LinkEndChild(new TiXmlText("10000"));
xml_client->LinkEndChild(xml_id);
xml_doc.SaveFile("xml_doc.xml"); //保存文件
//或者转成string
std::string text;
text << xml_doc;
printf("%s\n", text.c_str());
return 0;
}
请自行分析源码,效果如下
<?xml version="1.0" encoding="GBK" ?>
<root>
<host checked="true" station="1001">www.baidu.com</host>
<client>
<name>余生皆假期</name>
<id>10000</id>
</client>
</root>
值得注意的是,在结尾也可以转化为string,直接用<<操作符即可。我还用printf把他打印一下。