zoukankan      html  css  js  c++  java
  • cocos2d-x使用tinyxml2存储解析xml

    我用的是2.1.4的cocos2d-x,里面自带有tinyxml2库。

    导入头文件:
    #include "support/tinyxml2/tinyxml2.h"

    using namespace tinyxml2;

    一:创建xml并保存

    void TinyXmlDemo::createTinyXMLFile()
    {
        //储存XML文件的路径
        std::string    filePath = CCFileUtils::sharedFileUtils()->getWritablePath() + "tinyxmltest.xml";
        //xml文档
        tinyxml2::XMLDocument* pDoc = new tinyxml2::XMLDocument();
        if (pDoc == NULL)
        {
            return;
        }
         //xml声明
        XMLDeclaration* pDecl = pDoc->NewDeclaration("xml version="1.0" encoding="UTF-8"");
        if (pDecl == NULL)
        {
            return;
        }
        pDoc->LinkEndChild(pDecl);
        //节点plist
        XMLElement* plistElement = pDoc->NewElement("plist");
        plistElement->SetAttribute("version","1.0");
        pDoc->LinkEndChild(plistElement);
    
        //节点dict
        XMLElement* dictElement = pDoc->NewElement("dict");
        plistElement->LinkEndChild(dictElement);
        //节点key
        XMLElement* keyElement = pDoc->NewElement("key");
        keyElement->LinkEndChild(pDoc->NewText("keyText"));//给节点设置值
        dictElement->LinkEndChild(keyElement);
        //节点string
        XMLElement* stringElement = pDoc->NewElement("string");
        stringElement->LinkEndChild(pDoc->NewText("stringText"));//给节点设置值
        dictElement->LinkEndChild(stringElement);
        //节点array
        XMLElement* arrayElemet = pDoc->NewElement("array");
        dictElement->LinkEndChild(arrayElemet);
        for (int i = 0; i<3; i++)
        {
            XMLElement* strEle = pDoc->NewElement("string");
            strEle->LinkEndChild(pDoc->NewText("icon"));
            arrayElemet->LinkEndChild(strEle);
        }
        //保存文件
        pDoc->SaveFile(filePath.c_str());
        delete pDoc;
    
    }

    在win32上xml保存的路径是在D:cocos2d-x-2.1.4cocos2d-x-2.1.4Debug.win32里面

    <?xml version="1.0" encoding="UTF-8"?>
    <plist version="1.0">
        <dict>
            <key>keyText</key>
            <string>stringText</string>
            <array>
                <string>icon</string>
                <string>icon</string>
                <string>icon</string>
            </array>
        </dict>
    </plist>

    二:解析xml 

    void TinyXmlDemo::parseTinyXMLFile()
    {
        //储存XML文件的路径
        std::string    filePath = CCFileUtils::sharedFileUtils()->getWritablePath() + "tinyxmltest.xml";
        tinyxml2::XMLDocument* pDoc = new tinyxml2::XMLDocument();
        pDoc->LoadFile(filePath.c_str());
        //得到根节点
        XMLElement* rootElement = pDoc->RootElement();
        //打印根节点名字和值
        CCLog("%s,%s",rootElement->Value(),rootElement->GetText());
        //节点的第一个属性
        const XMLAttribute* attribute = rootElement->FirstAttribute();
        //打印属性的名字和值
        CCLog("%s %s",attribute->Name(),attribute->Value()); 
        //查找节点的属性值
        float value = 0.1f;
        rootElement->QueryFloatAttribute("version",&value);
        CCLog("%f",value);
        //设置节点属性值
        rootElement->SetAttribute("version", 1.4);
        //跟节点的第一个字节点 dict
        XMLElement *dictEle = rootElement->FirstChildElement();
        //dict下面的子节点 key
        XMLElement *keyEle = dictEle->FirstChildElement();
        //打印key节点的值
        CCLog("%s,%s",keyEle->Name(),keyEle->GetText());
        //key节点的next节点 string
        XMLElement *stringEle = keyEle->NextSiblingElement();
        CCLog("%s,%s",stringEle->Name(),stringEle->GetText());
        //string节点的子节点
        XMLElement *nulXmlEle = stringEle->FirstChildElement();
        if (NULL == nulXmlEle) {
            CCLog("string no childElement");
        }
        //array节点
        XMLElement *arrayEle= stringEle->NextSiblingElement();
        CCLog("%s,%s",arrayEle->Name(),arrayEle->GetText());
        XMLElement *array1 = arrayEle->FirstChildElement();
        CCLog("%s,%s",array1->Name(),array1->GetText());
        XMLElement *array2 = array1->NextSiblingElement();
        CCLog("%s,%s",array2->Name(),array2->GetText());
        XMLElement *array3 = arrayEle->LastChildElement();
        CCLog("%s,%s",array3->Name(),array3->GetText());
    
        //修改了xml记得保存
        pDoc->SaveFile(filePath.c_str());
    }

    打印输出:

    plist,(null)
    version 1.0
    1.000000
    key,keyText
    string,stringText
    string no childElement
    array,(null)
    string,icon
    string,icon
    string,icon

    由于修改了节点属性值,保存后的xml

    <?xml version="1.0" encoding="UTF-8"?>
    <plist version="1.4">
        <dict>
            <key>keyText</key>
            <string>stringText</string>
            <array>
                <string>icon</string>
                <string>icon</string>
                <string>icon</string>
            </array>
        </dict>
    </plist>

    参考http://blog.csdn.net/w18767104183/article/details/19837203

  • 相关阅读:
    P2048 [NOI2010]超级钢琴
    [LOJ#6468.] 魔法
    [牛客小白月赛18] Forsaken的数列
    [JSOI2011]柠檬
    [TJOI2015]组合数学
    【单调队列优化】[CF372C] Watching Fireworks is Fun
    【线段树】[Luogu P4198]楼房修建
    Python资源
    人生的几个阶段
    两种解读,生活的意义和方法
  • 原文地址:https://www.cnblogs.com/ycclmy/p/4270054.html
Copyright © 2011-2022 走看看