Xml是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。
TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译,使用TinyXML进行C++ XML解析,使用简单,容易上手。我们可以把我们需要传输的信息生成xml格式,然后进行传输,然后再接收端进行解析,得到我们想要的数据。这样做有一个好处,可以把要的信息提出出来,不要的信息不提取。
不讲那么多废话了!一切以应用为中心!直接说怎么用就行了!所有这一切的基础是用了tinyxml这个库。
在我的电脑里有一个xml文件,里面的内容如下:

如果我想加载xml文件里面的内容,然后打印出来,我们可以这样做:
-
#include<iostream>
-
#include"tinyxml.h"
-
#include<stdio.h>
-
#include<string.h>
-
-
using namespace std;
-
-
int main(int argc,char **argv)
-
{
-
const char *xml_file = "conf/test.xml";
-
TiXmlDocument doc;
-
-
if(doc.LoadFile(xml_file))
-
{
-
doc.Print();
-
}
-
else
-
{
-
printf("load file error\n");
-
return 1;
-
}
-
-
return 0;
-
}
编译执行后的结果是这样的:

有没有觉得这样简单了很多,不必像以前读文件一样,打开文件,读取文件里面的内容,然后打印出来。这里只需要调用几个函数就可以了。
你这时就会想,这不就跟读取文本信息差不多,有什么区别,我也可以封装出这样的一个函数,打印出xml里面的内容。其实tinyxml的功能远不止这些。下面主要讲几个个人觉得比较经常会用到的功能。
1、 一个xml文件,如果我们想把该文件解析出来,我们又该怎么做呢?看代码你就懂了:
-
#include<iostream>
-
#include"tinyxml.h"
-
#include<stdio.h>
-
#include<string.h>
-
-
using namespace std;
-
-
void read_xml1();
-
-
-
int main(int argc,char **argv)
-
{
-
read_xml1();
-
return 0;
-
}
-
-
void read_xml1()
-
{
-
const char *xml_file = "conf/test.xml";
-
/*定义一个文档对象*/
-
TiXmlDocument doc;
-
-
/*加载文件,成功则打印出文件,失败则返回*/
-
if(doc.LoadFile(xml_file))
-
{
-
doc.Print();
-
}
-
else
-
{
-
printf("load file error\n");
-
return;
-
}
-
-
/*获取根元素*/
-
TiXmlElement *rootElement = doc.RootElement();
-
-
-
TiXmlElement *person = rootElement->FirstChildElement();/*获取根元素的第一个子元素*/
-
-
for(;person != NULL; person = person->NextSiblingElement()) /*遍历所有的子元素*/
-
{
-
printf("*************************************************\n");
-
TiXmlAttribute *person_attribute = person->FirstAttribute(); /*获取该元素的属性*/
-
printf("%s : %s\n",person_attribute->Name(),person_attribute->Value());/*打印出属性的名字和值*/
-
-
TiXmlElement *name = person->FirstChildElement(); /*获取子元素*/
-
for(;name != NULL;name = name->NextSiblingElement())/*遍历子元素*/
-
{
-
printf("%s : %s\n",name->Value(),name->GetText());/*打印出子元素的值和text*/
-
}
-
}
-
}
编译执行后

通过以上方法,我们可以从中获取person的ID号、名字、年龄等信息。
2、 前面已经说到如何读取xml文件和解析xml文件。下面就该说下如何生成xml文件了!
-
#include<iostream>
-
#include"tinyxml.h"
-
#include<stdio.h>
-
#include<string.h>
-
-
using namespace std;
-
-
void read_xml1();
-
void write_xml1();
-
-
-
int main(int argc,char **argv)
-
{
-
write_xml1();
-
return 0;
-
}
-
-
-
void write_xml1()
-
{
-
-
/*创建一个xml文档对象*/
-
TiXmlDocument *doc = new TiXmlDocument();
-
-
/*创建一个声明并进行连接*/
-
TiXmlDeclaration *decl = new TiXmlDeclaration("2.0","UTF-8","");
-
doc->LinkEndChild(decl);
-
-
/*创建一个根元素并连接*/
-
TiXmlElement *rootElement = new TiXmlElement("Person");
-
doc->LinkEndChild(rootElement);
-
-
/*创建一个person元素并设置属性和进行连接*/
-
TiXmlElement *personElement = new TiXmlElement("person");
-
personElement->SetAttribute("ID","1");
-
rootElement->LinkEndChild(personElement);
-
-
/*创建一个name元素并设置text和进行连接*/
-
TiXmlElement *name = new TiXmlElement("name");
-
TiXmlText *nameText = new TiXmlText("tay");
-
name->LinkEndChild(nameText);
-
personElement->LinkEndChild(name);
-
-
/*创建一个age元素并设置text和进行连接*/
-
TiXmlElement *age = new TiXmlElement("age");
-
TiXmlText *ageText = new TiXmlText("19");
-
age->LinkEndChild(ageText);
-
personElement->LinkEndChild(age);
-
-
-
/***********************************/
-
/*创建一个person元素并设置属性和进行连接*/
-
TiXmlElement *personElement1 = new TiXmlElement("person");
-
personElement1->SetAttribute("ID","2");
-
rootElement->LinkEndChild(personElement1);
-
-
/*创建一个name元素并设置text和进行连接*/
-
TiXmlElement *name1 = new TiXmlElement("name");
-
TiXmlText *nameText1 = new TiXmlText("si");
-
name1->LinkEndChild(nameText1);
-
personElement1->LinkEndChild(name1);
-
-
/*创建一个age元素并设置text和进行连接*/
-
TiXmlElement *age1 = new TiXmlElement("age");
-
TiXmlText *ageText1 = new TiXmlText("25");
-
age1->LinkEndChild(ageText1);
-
personElement1->LinkEndChild(age1);
-
-
doc->SaveFile("conf/test.xml");
-
}
通过编译执行上面的代码,这样就可以直接生成一个test.xml文件了。
3、前面讲了那么多,所以的一切都是围绕文件来讲的,但是很多时候我们不需要生成xml文件,只需要把xml文件里面的内容放在一个buf里面,然后通过socket发送出去。然后在接收端接收到一个存放xml数据的buf中,通过解析这个buf就可以提出我们想要的信息。
-
#include<iostream>
-
#include"tinyxml.h"
-
#include<stdio.h>
-
#include<string.h>
-
-
using namespace std;
-
-
void read_xml1();
-
void write_xml1();
-
-
-
int main(int argc,char **argv)
-
{
-
write_xml1();
-
return 0;
-
}
-
-
-
void write_xml1()
-
{
-
-
/*创建一个xml文档对象*/
-
TiXmlDocument *doc = new TiXmlDocument();
-
-
/*创建一个声明并进行连接*/
-
TiXmlDeclaration *decl = new TiXmlDeclaration("2.0","UTF-8","");
-
doc->LinkEndChild(decl);
-
-
/*创建一个根元素并连接*/
-
TiXmlElement *rootElement = new TiXmlElement("Person");
-
doc->LinkEndChild(rootElement);
-
-
/*创建一个person元素并设置属性和进行连接*/
-
TiXmlElement *personElement = new TiXmlElement("person");
-
personElement->SetAttribute("ID","1");
-
rootElement->LinkEndChild(personElement);
-
-
/*创建一个name元素并设置text和进行连接*/
-
TiXmlElement *name = new TiXmlElement("name");
-
TiXmlText *nameText = new TiXmlText("tay");
-
name->LinkEndChild(nameText);
-
personElement->LinkEndChild(name);
-
-
/*创建一个age元素并设置text和进行连接*/
-
TiXmlElement *age = new TiXmlElement("age");
-
TiXmlText *ageText = new TiXmlText("19");
-
age->LinkEndChild(ageText);
-
personElement->LinkEndChild(age);
-
-
-
/***********************************/
-
/*创建一个person元素并设置属性和进行连接*/
-
TiXmlElement *personElement1 = new TiXmlElement("person");
-
personElement1->SetAttribute("ID","2");
-
rootElement->LinkEndChild(personElement1);
-
-
/*创建一个name元素并设置text和进行连接*/
-
TiXmlElement *name1 = new TiXmlElement("name");
-
TiXmlText *nameText1 = new TiXmlText("si");
-
name1->LinkEndChild(nameText1);
-
personElement1->LinkEndChild(name1);
-
-
/*创建一个age元素并设置text和进行连接*/
-
TiXmlElement *age1 = new TiXmlElement("age");
-
TiXmlText *ageText1 = new TiXmlText("25");
-
age1->LinkEndChild(ageText1);
-
personElement1->LinkEndChild(age1);
-
-
doc->SaveFile("conf/test.xml");
-
-
/*将xml的内容放到buf中,然后打印出来*/
-
char buf[4000]={0};
-
TiXmlPrinter pp;
-
doc->Accept(&pp);
-
memcpy(buf,pp.CStr(),pp.Size());
-
-
printf("buf:%s\n",buf);
-
-
TiXmlDocument doc1;
-
doc1.Parse(buf);
-
-
TiXmlElement *root = doc1.RootElement();
-
if(NULL == root)
-
{
-
printf("root error\n");
-
return;
-
}
-
-
TiXmlElement *person = root->FirstChildElement();
-
-
for(;person != NULL;person = person->NextSiblingElement())
-
{
-
printf("#########################################\n");
-
TiXmlAttribute *person_attribute = person->FirstAttribute(); /*获取该元素的属性*/
-
printf("%s : %s\n",person_attribute->Name(),person_attribute->Value());/*打印出属性的名字和值*/
-
-
TiXmlElement *name = person->FirstChildElement();
-
for(;name != NULL;name = name->NextSiblingElement())
-
{
-
printf("%s : %s\n",name->Value(),name->GetText());
-
}
-
}
-
}
编译执行后:

阅读(2138) | 评论(0) | 转发(0) |