Chinaunix首页 | 论坛 | 博客
  • 博客访问: 388954
  • 博文数量: 75
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 645
  • 用 户 组: 普通用户
  • 注册时间: 2015-06-03 18:24
文章分类

全部博文(75)

文章存档

2019年(1)

2018年(20)

2017年(14)

2016年(10)

2015年(30)

xml

分类: LINUX

2015-08-02 21:31:54

       Xml可扩展标记语言标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言

TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在WindowsLinux中编译,使用TinyXML进行C++ XML解析,使用简单,容易上手。我们可以把我们需要传输的信息生成xml格式,然后进行传输,然后再接收端进行解析,得到我们想要的数据。这样做有一个好处,可以把要的信息提出出来,不要的信息不提取。
        

不讲那么多废话了!一切以应用为中心!直接说怎么用就行了!所有这一切的基础是用了tinyxml这个库。


在我的电脑里有一个xml文件,里面的内容如下:


如果我想加载xml文件里面的内容,然后打印出来,我们可以这样做:


点击(此处)折叠或打开

  1. #include<iostream>
  2. #include"tinyxml.h"
  3. #include<stdio.h>
  4. #include<string.h>

  5. using namespace std;

  6. int main(int argc,char **argv)
  7. {
  8.     const char *xml_file = "conf/test.xml";
  9.     TiXmlDocument doc;

  10.     if(doc.LoadFile(xml_file))
  11.     {
  12.         doc.Print();
  13.     }
  14.     else
  15.     {
  16.         printf("load file error\n");
  17.         return 1;
  18.     }

  19.     return 0;
  20. }

编译执行后的结果是这样的:


有没有觉得这样简单了很多,不必像以前读文件一样,打开文件,读取文件里面的内容,然后打印出来。这里只需要调用几个函数就可以了。

 

你这时就会想,这不就跟读取文本信息差不多,有什么区别,我也可以封装出这样的一个函数,打印出xml里面的内容。其实tinyxml的功能远不止这些。下面主要讲几个个人觉得比较经常会用到的功能。


1、 一个xml文件,如果我们想把该文件解析出来,我们又该怎么做呢?看代码你就懂了:


点击(此处)折叠或打开

  1. #include<iostream>
  2. #include"tinyxml.h"
  3. #include<stdio.h>
  4. #include<string.h>

  5. using namespace std;

  6. void read_xml1();


  7. int main(int argc,char **argv)
  8. {
  9.     read_xml1();
  10.     return 0;
  11. }

  12. void read_xml1()
  13. {
  14.     const char *xml_file = "conf/test.xml";
  15.     /*定义一个文档对象*/
  16.     TiXmlDocument doc;

  17.     /*加载文件,成功则打印出文件,失败则返回*/
  18.     if(doc.LoadFile(xml_file))
  19.     {
  20.         doc.Print();
  21.     }
  22.     else
  23.     {
  24.         printf("load file error\n");
  25.         return;
  26.     }

  27.     /*获取根元素*/
  28.     TiXmlElement *rootElement = doc.RootElement();

  29.     
  30.     TiXmlElement *person = rootElement->FirstChildElement();/*获取根元素的第一个子元素*/

  31.     for(;person != NULL; person = person->NextSiblingElement()) /*遍历所有的子元素*/
  32.     {
  33.         printf("*************************************************\n");
  34.         TiXmlAttribute *person_attribute = person->FirstAttribute(); /*获取该元素的属性*/
  35.         printf("%s : %s\n",person_attribute->Name(),person_attribute->Value());/*打印出属性的名字和值*/

  36.         TiXmlElement *name = person->FirstChildElement(); /*获取子元素*/
  37.         for(;name != NULL;name = name->NextSiblingElement())/*遍历子元素*/
  38.         {
  39.             printf("%s : %s\n",name->Value(),name->GetText());/*打印出子元素的值和text*/
  40.         }
  41.     }
  42. }

编译执行后


通过以上方法,我们可以从中获取personID号、名字、年龄等信息。


2、 前面已经说到如何读取xml文件和解析xml文件。下面就该说下如何生成xml文件了!

点击(此处)折叠或打开

  1. #include<iostream>
  2. #include"tinyxml.h"
  3. #include<stdio.h>
  4. #include<string.h>

  5. using namespace std;

  6. void read_xml1();
  7. void write_xml1();


  8. int main(int argc,char **argv)
  9. {
  10.     write_xml1();
  11.     return 0;
  12. }


  13. void write_xml1()
  14. {

  15.     /*创建一个xml文档对象*/
  16.     TiXmlDocument *doc = new TiXmlDocument();

  17.     /*创建一个声明并进行连接*/
  18.     TiXmlDeclaration *decl = new TiXmlDeclaration("2.0","UTF-8","");
  19.     doc->LinkEndChild(decl);

  20.     /*创建一个根元素并连接*/
  21.     TiXmlElement *rootElement = new TiXmlElement("Person");
  22.     doc->LinkEndChild(rootElement);

  23.     /*创建一个person元素并设置属性和进行连接*/
  24.     TiXmlElement *personElement = new TiXmlElement("person");
  25.     personElement->SetAttribute("ID","1");
  26.     rootElement->LinkEndChild(personElement);

  27.     /*创建一个name元素并设置text和进行连接*/
  28.     TiXmlElement *name = new TiXmlElement("name");
  29.     TiXmlText *nameText = new TiXmlText("tay");
  30.     name->LinkEndChild(nameText);
  31.     personElement->LinkEndChild(name);

  32.     /*创建一个age元素并设置text和进行连接*/
  33.     TiXmlElement *age = new TiXmlElement("age");
  34.     TiXmlText *ageText = new TiXmlText("19");
  35.     age->LinkEndChild(ageText);
  36.     personElement->LinkEndChild(age);


  37. /***********************************/
  38.     /*创建一个person元素并设置属性和进行连接*/
  39.     TiXmlElement *personElement1 = new TiXmlElement("person");
  40.     personElement1->SetAttribute("ID","2");
  41.     rootElement->LinkEndChild(personElement1);

  42.     /*创建一个name元素并设置text和进行连接*/
  43.     TiXmlElement *name1 = new TiXmlElement("name");
  44.     TiXmlText *nameText1 = new TiXmlText("si");
  45.     name1->LinkEndChild(nameText1);
  46.     personElement1->LinkEndChild(name1);

  47.     /*创建一个age元素并设置text和进行连接*/
  48.     TiXmlElement *age1 = new TiXmlElement("age");
  49.     TiXmlText *ageText1 = new TiXmlText("25");
  50.     age1->LinkEndChild(ageText1);
  51.     personElement1->LinkEndChild(age1);

  52. doc->SaveFile("conf/test.xml");
  53. }

通过编译执行上面的代码,这样就可以直接生成一个test.xml文件了。



3、前面讲了那么多,所以的一切都是围绕文件来讲的,但是很多时候我们不需要生成xml文件,只需要把xml文件里面的内容放在一个buf里面,然后通过socket发送出去。然后在接收端接收到一个存放xml数据的buf中,通过解析这个buf就可以提出我们想要的信息。

点击(此处)折叠或打开

  1. #include<iostream>
  2. #include"tinyxml.h"
  3. #include<stdio.h>
  4. #include<string.h>

  5. using namespace std;

  6. void read_xml1();
  7. void write_xml1();


  8. int main(int argc,char **argv)
  9. {
  10.     write_xml1();
  11.     return 0;
  12. }


  13. void write_xml1()
  14. {

  15.     /*创建一个xml文档对象*/
  16.     TiXmlDocument *doc = new TiXmlDocument();

  17.     /*创建一个声明并进行连接*/
  18.     TiXmlDeclaration *decl = new TiXmlDeclaration("2.0","UTF-8","");
  19.     doc->LinkEndChild(decl);

  20.     /*创建一个根元素并连接*/
  21.     TiXmlElement *rootElement = new TiXmlElement("Person");
  22.     doc->LinkEndChild(rootElement);

  23.     /*创建一个person元素并设置属性和进行连接*/
  24.     TiXmlElement *personElement = new TiXmlElement("person");
  25.     personElement->SetAttribute("ID","1");
  26.     rootElement->LinkEndChild(personElement);

  27.     /*创建一个name元素并设置text和进行连接*/
  28.     TiXmlElement *name = new TiXmlElement("name");
  29.     TiXmlText *nameText = new TiXmlText("tay");
  30.     name->LinkEndChild(nameText);
  31.     personElement->LinkEndChild(name);

  32.     /*创建一个age元素并设置text和进行连接*/
  33.     TiXmlElement *age = new TiXmlElement("age");
  34.     TiXmlText *ageText = new TiXmlText("19");
  35.     age->LinkEndChild(ageText);
  36.     personElement->LinkEndChild(age);


  37. /***********************************/
  38.     /*创建一个person元素并设置属性和进行连接*/
  39.     TiXmlElement *personElement1 = new TiXmlElement("person");
  40.     personElement1->SetAttribute("ID","2");
  41.     rootElement->LinkEndChild(personElement1);

  42.     /*创建一个name元素并设置text和进行连接*/
  43.     TiXmlElement *name1 = new TiXmlElement("name");
  44.     TiXmlText *nameText1 = new TiXmlText("si");
  45.     name1->LinkEndChild(nameText1);
  46.     personElement1->LinkEndChild(name1);

  47.     /*创建一个age元素并设置text和进行连接*/
  48.     TiXmlElement *age1 = new TiXmlElement("age");
  49.     TiXmlText *ageText1 = new TiXmlText("25");
  50.     age1->LinkEndChild(ageText1);
  51.     personElement1->LinkEndChild(age1);

  52.     doc->SaveFile("conf/test.xml");

  53.     /*将xml的内容放到buf中,然后打印出来*/
  54.     char buf[4000]={0};
  55.     TiXmlPrinter pp;
  56.     doc->Accept(&pp);
  57.     memcpy(buf,pp.CStr(),pp.Size());

  58.     printf("buf:%s\n",buf);

  59.     TiXmlDocument doc1;
  60.     doc1.Parse(buf);

  61.     TiXmlElement *root = doc1.RootElement();
  62.     if(NULL == root)
  63.     {
  64.         printf("root error\n");
  65.         return;
  66.     }

  67.     TiXmlElement *person = root->FirstChildElement();

  68.     for(;person != NULL;person = person->NextSiblingElement())
  69.     {
  70.         printf("#########################################\n");
  71.         TiXmlAttribute *person_attribute = person->FirstAttribute(); /*获取该元素的属性*/
  72.         printf("%s : %s\n",person_attribute->Name(),person_attribute->Value());/*打印出属性的名字和值*/

  73.         TiXmlElement *name = person->FirstChildElement();
  74.         for(;name != NULL;name = name->NextSiblingElement())
  75.         {
  76.             printf("%s : %s\n",name->Value(),name->GetText());
  77.         }
  78.     }
  79. }

编译执行后:






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

上一篇:sscanf的用法

下一篇:ubuntu下静态IP的配置

给主人留下些什么吧!~~