cocos2dx 解析XML

解析方法有两种,一种需要添加解析类CCSAXParser解析器,一种是cocos2dx自带CCUserDefault

一 : 添加解析类CCSAXParser解析器

两个解析类及获取字符串代码如下

#ifndef __XML_PARSER_H__
#define __XML_PARSER_H__

#include 
    
    
     
     
#include "cocos2d.h"

NS_CC_BEGIN
class XMLParser :public CCObject ,public CCSAXDelegator
{
public:
	XMLParser();
	~XMLParser();

	CCDictionary  *m_pDict; 
	CCArray		 m_oDictDataArr;
	static XMLParser *parserWithFile(const char *pTmxFile); 
	bool initXmlParse(const char* xmlName);    //本地xml、文件中读取

	//  使用 CCSAXDelegator 重写3个回调函数 
	void startElement(void *ctx, const char *name, const char **atts); 
	void endElement(void *ctx, const char *name); 
	void textHandler(void *ctx, const char *ch, int len); 

	 cocos2d::CCString* getString(const char *key);//改
	 const char* GetStringByKey(const char* keyword);
private:
	std::string m_strRoot_name;  
	std::string m_strFirstKey;
	bool isJumpHeadData; 
	std::string startXmlElement;//用来记录每个key前字段 
	std::string endXmlElement;//用来记录每个key后字段 
	std::string currString;//记录每个value的值
};
NS_CC_END
#endif
#include "XMLParser.h"
USING_NS_CC;
using namespace std;
XMLParser::XMLParser():
	m_pDict(NULL),
	m_oDictDataArr()
{
}

XMLParser::~XMLParser()
{
}

XMLParser *XMLParser::parserWithFile(const char *pTmxFile)
{
	XMLParser *pRet = new XMLParser(); 
	if(pRet->initXmlParse(pTmxFile)) 
	{ 
		pRet->autorelease(); 
		return pRet; 
	} 
	CC_SAFE_DELETE(pRet); 
	return NULL; 
}

bool XMLParser::initXmlParse(const char* pXmlName)
{
	CCSAXParser pXMLParser;   
	m_pDict = CCDictionary::create();
	if (false == pXMLParser.init("UTF-8") ) 

	{ 
		CCLog("-----请使用utf-8格式!"); 
		return false; 
	} 
	pXMLParser.setDelegator(this); 
	std::string strPath =  CCFileUtils::sharedFileUtils()->fullPathForFilename(pXmlName); 
	bool ret = pXMLParser.parse( strPath.c_str() ); 
	return ret ;
}

//  使用 CCSAXDelegator 重写3个回调函数 
void XMLParser::startElement(void *ctx, const char *name, const char **atts)
{
	CC_UNUSED_PARAM(ctx); 

	startXmlElement = (char*)name; 
	if( isJumpHeadData ){//不跳过数据头 
		CCLog("------跳过root name"); 
		isJumpHeadData = false; 
		m_strRoot_name = startXmlElement; 
		return; 
	} 
}

void XMLParser::endElement(void *ctx, const char *name)
{
	CC_UNUSED_PARAM(ctx); 

	endXmlElement = (char*)name; 
	if( endXmlElement == m_strRoot_name ){//数据尾 
		CCLog("读取xml结束"); 
		isJumpHeadData = true; 
		m_strRoot_name = "";
		return; 
	}
}

void XMLParser::textHandler(void *ctx, const char *ch, int len)
{
	CC_UNUSED_PARAM(ctx); 
	currString = std::string((char*)ch,0,len); 
	CCString *ccStr = new CCString();//备注3 
	ccStr->m_sString = currString; 
	if( m_strRoot_name!="" )
	{
		if( m_strRoot_name != startXmlElement )
		{
		   if(m_strFirstKey == "") //如果第一个key值为空 就保存下这个key  
	    	{
				m_strFirstKey = startXmlElement;
				m_oDictDataArr.addObject(m_pDict);
		    }else if(m_strFirstKey == startXmlElement) //说明一组key已经读取完毕,需要保存到数组中
				{ //字典加到数组中
					m_pDict = CCDictionary::create();
					m_oDictDataArr.addObject(m_pDict);			
				}
			m_pDict->setObject(ccStr,startXmlElement); 
			ccStr->release();
		}
		CCLog("-----key:%s, value:%s",startXmlElement.c_str(),dynamic_cast
     
     
      
      (m_pDict->objectForKey(startXmlElement))->m_sString.c_str()); 
		
	
	} 
}
CCString* XMLParser::getString(const char *key)
{
    string strKey(key);

    return (CCString *)(this->m_pDict->valueForKey(key));


}
const char* XMLParser::GetStringByKey(const char* keyword)
{
	return ((CCString*)(this->m_pDict->objectForKey(keyword)))->m_sString.c_str();
}
//读取字符串信息(无法显示中文,需要添加库)----------------------------
XMLParser *pXmlParser = XMLParser::parserWithFile("strings.xml");
CCString *pValue1 = pXmlParser->getString("string");
CCString *pValue2 = pXmlParser->getString("person");

CCLOG("asdfasf %s", pValue1->m_sString.c_str());
CCString *pValue = CCString::createWithFormat("%s%s%s%s", "XML: ", pValue1->getCString(), ",", pValue2->getCString());
CCLabelTTF* pLabel2 = CCLabelTTF::create(pValue->getCString(), "Arial", 30);
pLabel2->setColor(ccWHITE);
  pLabel2->setPosition(ccp(visibleSize.width / 2, visibleSize.height / 2));
this->addChild(pLabel2,2);

//读取以  , 分割的坐标信息----------------------------------
CCString *xarry =pXmlParser->getString("xarry");
CCString *yarry = pXmlParser -> getString("yarry");
float arrayx[10];
float arrayy[10];
int t=0;
char *px=strtok(const_cast
      
      
       
       (xarry->m_sString.c_str()),",");  //以 , 分割字符串  ( char-> char 内部强制转换)

while (px != NULL&&t<=10)  
  {  
    // CCLOG("( %s )\n",px);  
	    arrayx[t]=atof(px);
   px = strtok (NULL, ",");  //下一个字符串
 
	t++;
   
   
  }  
char *py=strtok(const_cast
       
       
        
        (yarry->m_sString.c_str()),",");
t=0;
while (py!=NULL&&t<=10)  
  {  
    // CCLOG("( %s )\n",py);  
	 arrayy[t]=atof(py);
   py= strtok (NULL, ",");  
     CCLOG("(%.2f %.2f)",arrayx[t],arrayy[t]);
	t++;
 
   
  }

       
       
      
      
     
     
    
    
strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">hello</string>
    <person name="name">Xml</person>
     <xarry name="x">1.5,2,3,4,5,6,7,8,9</xarry>
     <yarry name="y">9,8,7,6,5,4,3,2,1,8</yarry>
</resources>
二:CCUserDefault解析


	  CCUserDefault::sharedUserDefault()->setStringForKey("xarray",  "80,100,120,140,160");//保存字符串到UserDefault.xml中
	 
      CCUserDefault::sharedUserDefault()->flush();//这里一定要提交写入哦,否则不会记录到xml中,下次启动游戏你就获取不到value了。
    
   
	CCLog("***********%s************",CCUserDefault::sharedUserDefault()->getStringForKey("xarray").c_str());		                                           
    CCLog("***********************path= %s**********************",CCUserDefault::sharedUserDefault()->getXMLFilePath().c_str());

	


	float arrayx[5];
   
   int t=0;
   std::string d=CCUserDefault::sharedUserDefault()->getStringForKey("xarray");
   	CCLog("string  %s",CCUserDefault::sharedUserDefault()->getStringForKey("xarray").c_str());

    char *px=strtok(const_cast
    
    
     
     (d.c_str()),",");//const char->char

    while (px != NULL&&t<=5)  
    {  
       // CCLOG("( %s )\n",px);  
	    arrayx[t]=atof(px);
        px = strtok (NULL, ","); 
		CCLOG("(%.2f)",arrayx[t]);
     	t++;
  } 

    
    

UserDefault.xml  (文件目录--proj.win32\Debug.win32)

<?xml version="1.0" encoding="UTF-8"?>
<userDefaultRoot>
    <key>himi</key>
    <xarray>80,100,120,140,160</xarray>     
</userDefaultRoot>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值