做軟件的不會c++,都不好意思說自己是搞軟件的。最近也開始慢慢學習c++的東西,今天就寫寫c++如何操作xml文件吧。我們使用的是tinyxml,有個小巧的庫,可以生成和解析XML文檔。免費開源,可以直接將源碼加到項目中,適合多種平臺。他的官方文檔爲http://sourceforge.net/projects/tinyxml/,可以直接從上面下載相關資源。下載好之後添加到VC項目中,下面說說如何把它添加到項目中吧。
第一步,找到我們的項目路徑,右擊項目,然後如圖:
點擊“在文件資源管理器中打開文件夾”,然後就可以看到我們項目所在的路徑了。
第二步,在項目路徑下解壓下載好的壓縮包
第三步,將其添加到項目中
名字隨機去,然後右鍵該文件
點擊現有項,找到剛纔解壓的路徑,全選然後添加就好了
添加之後,應該如圖所示
添加到項目之後,就開始對xml進行操作,不多說,直接上代碼
example.xml的代碼如下:
<?xml version="1,0" encoding="GBK" ?>
<root>
<host checked="true" station="1001">127.0.0.1</host>
<client>
<name>andy</name>
<id>20190608</id>
</client>
</root>
aaaa.xml的代碼如下
<?xml version="1.0" encoding="GBK" ?>
<root>
<node>
<id>1</id>
<when>2016-1-23 10:00</when>
<where>吃飯</where>
<who>Wang</who>
</node>
<node>
<id>2</id>
<when>2016-1-21 20:00</when>
<where>看電影</where>
<who>Jiang</who>
</node>
<node>
<id>3</id>
<when>2016-1-20 9:00</when>
<where>去博物館</where>
<who>Li</who>
</node>
</root>
c++的代碼
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
#include "../tinyxml/tinyxml.h"
void addChile( TiXmlElement * parent, const char* node, int value);
void addChile( TiXmlElement * parent, const char* node, const char* value);
struct Node
{
int id;
char when[32];
char who[32];
char where[32];
};
vector<Node> nodes;
vector<Node> Node_read;
//想容器添加東西
void addNode(int id, const char* when , const char* who , const char* where)
{
Node n;
n.id = id;
strcpy(n.when, when);
strcpy(n.who, who);
strcpy(n.where, where);
nodes.push_back(n);
}
//保存到xml文件中
int save()
{
TiXmlDocument xml_doc;
//添加聲明
xml_doc.LinkEndChild(new TiXmlDeclaration("1.0" , "GBK" , ""));
//添加根元素
TiXmlElement* xml_root = new TiXmlElement("root");
xml_doc.LinkEndChild(xml_root);
//根元素下面添加節點
for (unsigned int i = 0; i < nodes.size(); i++)
{
Node& n = nodes[i];
//創建一個節點
TiXmlElement* xml_node = new TiXmlElement("node");
xml_root->LinkEndChild(xml_node);
//創建第一個子節點
if (1)
{
addChile(xml_node, "id" , n.id);
addChile(xml_node, "when", n.when);
addChile(xml_node, "where", n.where);
addChile(xml_node, "who", n.who);
}
}
//保存文件
xml_doc.SaveFile("aaaa.xml");
return 0;
}
//添加子節點
void addChile( TiXmlElement * parent , const char* node , int value)
{
//創建節點
TiXmlElement* xml_node = new TiXmlElement(node);
//將int轉爲char
char buf[32];
sprintf(buf , "%d" , value);
xml_node->LinkEndChild(new TiXmlText(buf));
parent->LinkEndChild(xml_node);
}
void addChile( TiXmlElement * parent, const char* node, const char* value)
{
//創建節點
TiXmlElement* xml_node = new TiXmlElement(node);
//將int轉爲char
xml_node->LinkEndChild(new TiXmlText(value));
parent->LinkEndChild(xml_node);
}
//生成xml文件
int test1()
{
TiXmlDocument xml_doc;
//添加XML聲明
xml_doc.LinkEndChild(new TiXmlDeclaration("1,0", "GBK", ""));
//添加根元素
TiXmlElement* xml_root = new TiXmlElement("root");
xml_doc.LinkEndChild(xml_root);
//在根元素添加其他子元素
if (1)
{
//添加host
TiXmlElement* xml_child = new TiXmlElement("host");
xml_root->LinkEndChild(xml_child);
//添加文檔內容
xml_child->LinkEndChild(new TiXmlText("127.0.0.1"));
//設置屬性
xml_child->SetAttribute("checked", "true");
xml_child->SetAttribute("station", 1001);
}
//嵌套子元素
if (1)
{
TiXmlElement* xml_client = new TiXmlElement("client");
xml_root->LinkEndChild(xml_client);
TiXmlElement* xml_clientName = new TiXmlElement("name");
xml_clientName->LinkEndChild(new TiXmlText("andy"));
xml_client->LinkEndChild(xml_clientName);
TiXmlElement* xml_clientId = new TiXmlElement("id");
xml_clientId->LinkEndChild(new TiXmlText("20190608"));
xml_client->LinkEndChild(xml_clientId);
//保存文件
xml_doc.SaveFile("example.xml");
//或者轉成string
string text;
text << xml_doc;
return 0;
}
}
//解析xml文件
int test2()
{
//解析xml
TiXmlDocument xml_doc;
if (!xml_doc.LoadFile("example.xml"))
{
return -1;
}
//根節點
TiXmlElement* xml_root = xml_doc.RootElement();
if (xml_root == NULL)
{
return -1;
}
//獲取元素的文本與屬性
if (1)
{
TiXmlElement* xml_host = xml_root->FirstChildElement("host");
const char* text = xml_host->GetText();
const char* aCheckedd = xml_host->Attribute("checked");
const char* aStation = xml_host->Attribute("station");
printf("text:%s , checked:%s , station:%s", text, aCheckedd, aStation);
}
if (1)
{
TiXmlElement* xml_client = xml_root->FirstChildElement("client");
TiXmlElement* xml_name = xml_client->FirstChildElement("name");
TiXmlElement* xml_id = xml_client->FirstChildElement("id");
}
return 0;
}
//解析多個子節點
int test3()
{
//開始解析
TiXmlDocument xml_doc;
if (!xml_doc.LoadFile("aaaa.xml"))
{
return -1;
}
//獲取根元素
TiXmlElement* xml_root = xml_doc.RootElement();
if (xml_root == NULL)
{
return -1;
}
TiXmlElement* xml_note = xml_root->FirstChildElement("node");
while (xml_note)
{
Node n;
//獲取他們的值
TiXmlElement* xml_id = xml_note->FirstChildElement("id");
const char* id = xml_id->GetText();
n.id = atoi(id);
TiXmlElement* xml_when = xml_note->FirstChildElement("when");
strcpy(n.when, xml_when->GetText());
TiXmlElement* xml_where = xml_note->FirstChildElement("where");
strcpy(n.where, xml_where->GetText());
TiXmlElement* xml_who = xml_note->FirstChildElement("who");
strcpy(n.who, xml_who->GetText());
Node_read.push_back(n);
//只想下一個兄弟節點
xml_note = xml_note->NextSiblingElement();
}
}
int main()
{
//test1();
//addNode(1, "2016-1-23 10:00", "Wang", "吃飯");
//addNode(2, "2016-1-21 20:00", "Jiang", "看電影");
//addNode(3, "2016-1-20 9:00", "Li", "去博物館");
//save();
test3();
//遍歷vector
for (int i = 0; i < Node_read.size(); i++)
{
Node n = Node_read[i];
printf("id:%d \n, when:%s \n , where:%s \n, who:%s\n" , n.id , n.when , n.where , n.who);
}
printf("保存成功!\n");
return 0;
}
至此,c++操作xml常見的使用方法已完成,請大家多多指教。