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.4\cocos2d-x-2.1.4\Debug.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

posted @ 2015-02-03 15:05  百里抱木  阅读(872)  评论(1编辑  收藏  举报