TinyXml的简单使用以及几种数据传输格式的对比

TinyXml的简单使用以及XML、Json、Protobuf的对比。

之前学习过了JsonCpp和protobuf的简单使用,那这次再来个TinyXML的吧,毕竟XML应用非常广泛。

TinyXml

XML

一个简单地XML文件如下所示,这种数据格式拥有较好的自我描述性,一看就能够明白他的内容是什么。

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

XML必须要有root元素,并且每一个标签要成对出现。
可以在这个网站了解XML基础知识。

使用方法

  • TinyXml是一个简单易用的XML解析库,用的时候把tinystr.h、tinystr.cpp、tinyxml.h、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp六个文件放到项目的目录下,然后在cpp文件中include这个头文件tinyxml.h,然后就可以用了。
  • 代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    #include <iostream>
    #include <string>
    #include "tinyxml.h"
    using namespace std;

    bool saveXML(string filename){
    TiXmlDocument doc;
    TiXmlElement *root=new TiXmlElement("root");
    doc.LinkEndChild(root);

    TiXmlElement *elem1=new TiXmlElement("from");
    TiXmlElement *elem2=new TiXmlElement("to");
    TiXmlElement *elem3=new TiXmlElement("title");
    TiXmlElement *elem4=new TiXmlElement("text");

    TiXmlText *t1=new TiXmlText("Tom");
    TiXmlText *t2=new TiXmlText("Army");
    TiXmlText *t3=new TiXmlText("Hello");
    TiXmlText *t4=new TiXmlText("Hello,Army");

    root->LinkEndChild(elem1);
    root->LinkEndChild(elem2);
    root->LinkEndChild(elem3);
    root->LinkEndChild(elem4);

    elem1->LinkEndChild(t1);
    elem2->LinkEndChild(t2);
    elem3->LinkEndChild(t3);
    elem4->LinkEndChild(t4);

    bool sucess=doc.SaveFile(filename.c_str());
    doc.Clear();
    return sucess;
    }

    bool loadXML(string filename){
    TiXmlDocument doc;
    if(!doc.LoadFile(filename.c_str())){
    cout<<"load error"<<endl;
    return false;
    }
    TiXmlElement *root=doc.FirstChildElement();
    if(root==nullptr){
    cout<<"no root element"<<endl;
    return false;
    }
    for(TiXmlElement *elem=root->FirstChildElement();
    elem!=nullptr;
    elem=elem->NextSiblingElement()){
    cout<<elem->Value()<<":";
    cout<<elem->FirstChild()->Value()<<endl;
    }
    return true;
    }

    int main()
    {
    cout<<"向message.xml写入一条消息"<<endl;
    cout<<(saveXML("message.xml") ? "save sucess" : "save failure")<<endl;
    cout<<endl;
    cout<<(loadXML("message.xml") ? "load sucess" : "load failure")<<endl;
    return 0;
    }
  • 输出

    1
    2
    3
    4
    5
    6
    7
    8
    向message.xml写入一条消息
    save sucess

    from:Tom
    to:Army
    title:Hello
    text:Hello,Army
    load sucess

几种格式对比

  • XML、Json、Protobuf几种格式还是各有优劣的,都有不同的适应场合。

XML

  • Extensible Markup Language 可扩展标记语言
  • 出现在1998年,时间较早,应用广泛
  • 与平台无关
  • 为了解决HTML无法描述数据、可读性差、搜索时间长等问题而出现
  • 自描述性较好
  • 可扩展性好,能够轻松地增加字段
  • 相对来说速度并不快

Json

  • JavaScript Object Notation, JS对象简谱
  • 在2005年-2006年正式成为主流的数据格式。
  • 层次结构简洁清晰,易于阅读和编写,应用广泛
  • 速度较快,但不够快

protocol buffers

  • Google的一种独立的数据交换格式,后起之秀,有多种语言的版本
  • Early 2001 (internal); July 7, 2008 (public)
  • 速度非常块,占用空间很小,适合对时间要求严格的情况
  • 但是数据是二进制存储,需要解码才能看到内容

参考

XML教程
TinyXml官网
TinyXml Documentation
C++解析XML
c++之TinyXml使用与应用,包含简单的例子

欢迎与我分享你的看法。
转载请注明出处:http://taowusheng.cn/