XML的自定义多极Map序列化和反序列化

来源:互联网 发布:农村淘宝亏了好几万 编辑:程序博客网 时间:2024/04/27 21:57

主要思路就是递归,传入一个Map类型的字典容器。

打个比方,一个英雄的技能星系,道具星系,武器星系,属性信息等等,都可以封装在一个Map中,而这个Map中的技能是一个map,属性是一些数据,而道具可能是数组等等。

这样一个多极map的序列化应该如何操作?一个序列化函数搞定。

XML解码与编码

*****************根据一个map编码*********************
1⃣️第一个函数就是传一个Map,这是一个入口函数,参数一是写入到的文件路径,第二个参数是需要写入的map

void XML_DOMParser::write_base(const char*filepath,ValueMap pmap)

{

    tinyxml2::XMLDocument*pdoc=new tinyxml2::XMLDocument();

    if (pdoc==NULL) {

        return ;

    }

    XMLDeclaration*pDel=pdoc->NewDeclaration("xml version=\"1.0\" encoding=\"UTF-8\"");

    if (pDel==NULL) {

        return ;

    }

    pdoc->LinkEndChild(pDel);

    XMLElement*plistElement=pdoc->NewElement("plist");

    plistElement->SetAttribute("version""1.0");

    pdoc->LinkEndChild(plistElement);

    for (auto i:pmap){

    XMLNode* pDict=pdoc->NewElement(i.first.c_str());

        write_base(i.second,pDict,pdoc);

    plistElement->LinkEndChild(pDict);

    }

    pdoc->SaveFile(filepath);

    delete pdoc;

    

}

2⃣️第二个函数是针对第一个函数的子节点的操作,是一个内部函数,非对外接口,可以写成private,进行封装。

  //一个Value,可能是Map或者string;父节点;XML文本对象

void XML_DOMParser::write_base(Value vp,XMLNode*pa,tinyxml2::XMLDocument*pdoc)

{

    if (vp.getType()==Value::Type::MAP) {

        ValueMap pmap=vp.asValueMap();

        for (auto i:pmap) {

            XMLElement* pDict=pdoc->NewElement(i.first.c_str());

            write_base(i.second,pDict,pdoc);

                pa->LinkEndChild(pDict);

        }

    }

    else if(vp.getType()==Value::Type::STRING)

    {

        pa->LinkEndChild(pdoc->NewText(vp.asString().c_str()));

    }

}

*****************将XML解码到一个Map中*********************
3⃣️这个函数也是接口函数,调用这个函数将把文件写入到一个map,并将这个map返回。参数是目标文件路径,也就是初始化的配置表

cocos2d::ValueMap XML_DOMParser::read_xmlitoos_to_map(const char*filepath)

{

    ValueMap pmap;

    //新建文件类

    tinyxml2::XMLDocument*pdoc=new tinyxml2::XMLDocument();

    //载入目标文件

    pdoc->LoadFile(filepath);

    //获取根节点

    XMLElement*rootEle=pdoc->RootElement();

    //访问该节点

    if (rootEle->GetText()!=nullptr) {

        pmap[rootEle->Name()]=Value(rootEle->GetText());

    }

    else{

    pmap=read_base_to_map(rootEle);

    }

    return pmap;

}

4⃣️第二个函数是内部函数,也是内部调用的,可以写成private增加封装

cocos2d::ValueMap XML_DOMParser::read_base_to_map(tinyxml2::XMLElement*rootele)

{

    ValueMap pmap;

    //获取根节点的第一个子节点temp

    XMLElement*temp=rootele->FirstChildElement();

    //如果存在,执行遍历

    while (temp!=NULL)

    {

   //不是文本,就是map

        if (temp->GetText()!=nullptr) {

            pmap[temp->Name()]=Value(temp->GetText());

          

        }

        else{

        ValueMap child_map;

        //访问以temp为根节点的树

        child_map=read_base_to_map(temp);

        //插入进去

        pmap[temp->Name()]=Value(child_map);

        }


        //访问temp的所有兄弟节点

        temp=temp->NextSiblingElement();

    }

    return pmap;

}

然后调用:

    //XML_DOMParser是包含这4个函数的一个类

    XML_DOMParser*xp=newXML_DOMParser();

    xp->write_base("/Users/mac/Desktop/beifenwork/homework3.xml",xp->read_xmlitoos_to_map("/Users/mac/Desktop/beifenwork/homework.xml"));

结果如下


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 装显卡后玩游戏黑屏怎么办 顺丰寄主机坏了怎么办 征信账户忘记了怎么办 疑似qq和疑似应用宝怎么办 荣大3608速印机卸版故障怎么办 配的近视眼镜看不清电脑屏幕怎么办 cad命令反应很慢怎么办 淘宝美工面试让作图怎么办 笔记本玩cf闪退怎么办 台式电脑玩lol卡怎么办 配置充足玩lol卡怎么办 电脑买贵了应该怎么办 微信红包收不了钱怎么办 mac版excel卡死怎么办 锐捷网卡为空怎么办 淘宝上买东西卖家不发货怎么办 快递员没给单号怎么办 淘宝物流把货弄丢了怎么办 刚买的卡没激活怎么办 腾讯王卡40g用完怎么办 手机欠费不知道电话号码怎么办 手机欠费了不用了怎么办 闲鱼恶意差评怎么办 淘宝买家账户体检中心违规怎么办 淘宝卖家账户体检中心违规怎么办 淘宝好评被删除评价怎么办 淘宝没收到货确认收货了怎么办 美团评论被删怎么办 拼多多恶意差评怎么办 淘宝评论被删了怎么办 淘宝买东西错怪店家了怎么办 淘宝骗删除差评怎么办 淘宝买家号虚假交易违规怎么办 淘宝商家一直不发货怎么办 淘宝商家不发货也不退款怎么办 淘宝买家恶意差评怎么办 淘宝评价完了忘截图了怎么办 12306app登录不上怎么办 淘宝换绑支付宝失败怎么办 淘宝和手机不兼容怎么办 换号之后微信怎么办