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

2022-11-14 14:27:19 浏览数 (1)

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

TinyXml

XML

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

代码语言:javascript复制
<?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,然后就可以用了。

代码如下:

代码语言:javascript复制
#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;
}

输出

代码语言:javascript复制
向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/

0 人点赞