XML读与写

XML读与写

1.1 XML文档格式

  1.1.1 XML, EXtensible Markup Language 可扩展标记语言。

   实际上,XML的应用一般比较简单,还够不上 一个“语言”的级别。XML是一个数据格式,符合这种格式的文件后 缀名通常为*.xml
   优点:可读性强!
   缺点:解析费时、占用空间大、效率低!

  1.1.2 XML声明

   XML文档的第一行必须是声明语句:例如,

 <?xml version="1.0" encoding="GBK"?>  
 version 版本号:总是1.0
 encoding 文字编码:GBK, UTF-8等

  1.1.3 XML语法

<?xml version="1.0" encoding="GBK"?>
 <root>  
<host> nihao.cn </host>
<port> 1230 </port>
</root> 

   简言之,XML文档是一个由元素构成的树型结 构。root,host, port都是元素

  1.1.3 XML的元素

   示例:

<Contact  id="1001"  page="1">     
<Name> qixiaofan </Name>   
... 
</Contact> 
1. 名称Name:必须配对!
   <Name> shaofa </Name>   
<name> shaofa </name>   

   以下写法不对:

<NAME> qixiaofan </name> 

    NAME与name不配对

二 以工程为例

    在此之前,先介绍一个很好用的库,tinyxml。

   tinyxml: 一个小巧的xml库,可以生成和解析XML文档。免费开源,可以直接将源码加到项目中,适合多种平台。
    可以从tinyxml作者的官网下载,传送门
    也可以从CSDN中下载 ,传送门

  2.1 XML的写入

   目标写入的文件内容:
这里写图片描述

函数实现:

struct Note
{
    int id;
    char when[32];
    char who[32];
    char what[128];
};

vector<Note> notes;

int save()
{
    TiXmlDocument xml_doc;
    xml_doc.LinkEndChild(new TiXmlDeclaration( "1.0", "GBK", "" ));

    TiXmlElement * xml_root = new TiXmlElement("root");
    xml_doc.LinkEndChild(xml_root);

    TiXmlElement* xml_NoteList = new TiXmlElement("NoteList");
    xml_root->LinkEndChild(xml_NoteList);

    // 添加host元素
    for(int i=0; i<notes.size(); i++)
    {
        Note& r = notes[i];

        TiXmlElement* xml_Note = new TiXmlElement("Note");
        xml_NoteList->LinkEndChild(xml_Note);

        AfTinyXml::addChild(xml_Note, "id", r.id);
        AfTinyXml::addChild(xml_Note, "when", r.when);
        AfTinyXml::addChild(xml_Note, "who", r.who);
        AfTinyXml::addChild(xml_Note, "what", r.what);
    }

    //第一种方法:是将数据保存到本地
    xml_doc.SaveFile("example02b.xml");

    ////第二种方法:是将数据保存成string
    //string txt;
    //txt << xml_doc;
    //cout << txt << endl;

    return 0;
}

void addNote(int id, const char* when, const char* who, const char* what)
{
    Note n;
    n.id = id;
    strcpy(n.when, when);
    strcpy(n.who, who);
    strcpy(n.what, what);
    notes.push_back(n);
}

int main()
{
    addNote(1, "2018-1-26 1:00", "Qi", "睡觉");
    addNote(2, "2019-1-21 2:00", "Ge", "打豆豆");
    addNote(3, "2020-2-20 5:00", "Yong", "看书");

    save();
    return 0;
}

  2.1 XML的读取。

   读取的文件和上述的写入文件一致。
   函数实现如下:

struct Note
{
    int id;
    char when[32];
    char who[32];
    char what[128];
};

vector<Note> notes;

int main()
{
    // 解析xml
    TiXmlDocument xml_doc;
    if(!xml_doc.LoadFile("example02b.xml"))
    {
        return -1;
    }

    // 根节点
    TiXmlElement* xml_root = xml_doc.RootElement();
    if (NULL == xml_root)
    {
        return -1;
    }

    // 获取元素的文本与属性

    TiXmlElement* xml_NoteList = xml_root->FirstChildElement("NoteList");
    if(xml_NoteList)
    {
        TiXmlElement* xml_Note = xml_NoteList->FirstChildElement("Note");
        while(xml_Note)
        {
            // 取得子元素的文本
            int id = AfTinyXml::childAsInt(xml_Note, "id");
            string when = AfTinyXml::childAsText(xml_Note, "when");
            string who = AfTinyXml::childAsText(xml_Note, "who");           
            string what = AfTinyXml::childAsText(xml_Note, "what");

            // 保存到列表
            Note r;
            r.id = id;
            strcpy(r.when, when.c_str());
            strcpy(r.who, who.c_str());
            strcpy(r.what, what.c_str());
            notes.push_back(r);

            // 下一个兄弟元素
            xml_Note = xml_Note->NextSiblingElement("Note");
        }
    }


    return 0;
}

    至此,XML文件的简单用法便已经总结好了。对于更复杂的读入和写入操作,需要再进一步研究XML方可实现。
    封装好的项目工程文件(包括读入和写入操作,以及XML文件的PPT讲解):传送门

  个人公众号:

这里写图片描述

猜你喜欢

转载自blog.csdn.net/yong_qi2015/article/details/79173337