cocos2d-x解析xml文件
2014-02-21 16:18
351 查看
cocos2d-x解析xml文件
解析xml文件可以是使用第三方的开源库,这里我们谁用TinyXML,这里是这个库的下载地址http://sourceforge.net/projects/tinyxm
我们用的只有里面的两个头文件tinystr.h、tinyxml.h和4个cpp文件tinystr.cpp、tinycml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp,xml的解析主要是通过获取节点的方法来遍历整个文本,主要用到的是TiXmlNode、TiXmlElement和TiXmlAttribute(获取元素的属性)这三个类,其中TiXmlNode是TiXmlElement的父类,将这几个文件直接放在Classes里面就可以用了。例子中的用法和以前的例子做json解析类似,都是讲文本读到一个tableview上显示,具体看代码。
代码如下:
bool XmlParser::init()
{
if(!CCLayer::init())
{
return false;
}
dictionary=CCDictionary::create();
dictionary->retain();
size=CCDirector::sharedDirector()->getWinSize();
CCSprite* background=CCSprite::create("background.jpg");
background->setPosition(ccp(size.width*0.5,size.height*0.5));
this->addChild(background);
parseXml();
CCTableView* viewLayer=CCTableView::create(this, CCSizeMake(430, 600));
viewLayer->setAnchorPoint(ccp(0.5,0.5));
viewLayer->setDirection(kCCScrollViewDirectionVertical);
viewLayer->setVerticalFillOrder(kCCTableViewFillTopDown);
viewLayer->setPosition(ccp(background->getContentSize().width/2-220,background->getContentSize().height/2-400));
viewLayer->setContentOffset(ccp(0, 600-viewLayer->getContentSize().height));
viewLayer->setDelegate(this);
this->addChild(viewLayer);
return true;
}
void XmlParser::parseXml()//解析xml
{
int index=0;
GradeInfo* firstInfo=GradeInfo::getInstance();
std::string xmlFile=CCFileUtils::sharedFileUtils()->fullPathForFilename("perinfo.xml");
TiXmlDocument* xmlData=new TiXmlDocument(xmlFile.c_str());//初始化一个xml文档对象
xmlData->LoadFile();
TiXmlElement* rootNode=xmlData->RootElement();//每个xml文件对应一个唯一根节点,这里获取根节点。
CCLog("%s",rootNode->Value());
TiXmlElement* firstNode=rootNode->FirstChildElement();//获取根节点的第一个子节点
TiXmlElement* nameTag=firstNode->FirstChildElement();//获取第一个子节点的孩子节点
CCLog("%s",nameTag->GetText());
TiXmlElement* scoreTag=nameTag->NextSiblingElement();//获取孩子节点的兄弟节点(即同级节点,具体含义视获取这个节点的对象而定)
CCLog("%s",scoreTag->GetText());
firstInfo->name=nameTag->GetText();//得到节点的文本
firstInfo->score=scoreTag->GetText();
dictionary->setObject(firstInfo, 0);
for(firstNode=firstNode->NextSiblingElement();firstNode->NextSiblingElement()!=NULL;firstNode=firstNode->NextSiblingElement())//做一个遍历,从第二个子节点到倒数第二个子节点
{
index++;
GradeInfo* firstInfo=GradeInfo::getInstance();
TiXmlElement* nameTag=firstNode->FirstChildElement();
TiXmlElement* scoreTag=nameTag->NextSiblingElement();
firstInfo->name=nameTag->GetText();
CCLog("%s",nameTag->GetText());
firstInfo->score=scoreTag->GetText();
CCLog("%s",scoreTag->GetText());
dictionary->setObject(firstInfo, index);
}
index++;
TiXmlNode* lastNode=rootNode->LastChild();//这里再取出最后一个子节点
TiXmlElement* name=lastNode->FirstChildElement();
TiXmlElement* score=name->NextSiblingElement();
GradeInfo* lastInfo=GradeInfo::getInstance();
lastInfo->name=name->GetText();
lastInfo->score=score->GetText();
dictionary->setObject(lastInfo, index);//所有节点信息都保存在字典中
}
void XmlParser::scrollViewDidScroll(CCScrollView* view)
{
}
void XmlParser::scrollViewDidZoom(CCScrollView* view)
{
}
void XmlParser::tableCellTouched(CCTableView* table, CCTableViewCell* cell)
{
CCLog("This is number %d",cell->getIdx());
}
CCSize XmlParser::cellSizeForTable(CCTableView *table)
{
return CCSizeMake(500, 81);
}
CCTableViewCell* XmlParser::tableCellAtIndex(CCTableView *table, unsigned int idx)
{
CCTableViewCell* viewCell=new CCTableViewCell();
viewCell->autorelease();
viewCell->setAnchorPoint(CCPointZero);
viewCell->setPosition(CCPointZero);
CCSprite* cellSprite=CCSprite::create("cell.png");
cellSprite->setAnchorPoint(CCPointZero);
cellSprite->setPosition(CCPointZero);
GradeInfo* infomation=(GradeInfo*)dictionary->objectForKey(idx);
char num[5]="";
sprintf(num,"%d",idx);
CCLabelTTF* idxLabel=CCLabelTTF::create(num, "", 25);
CCLog("%s",num);
idxLabel->setAnchorPoint(CCPointZero);
idxLabel->setPosition(ccp(20,cellSprite->getContentSize().height/2));
CCLog("%s",infomation->name.c_str());
CCLabelTTF* nameLabel=CCLabelTTF::create(infomation->name.c_str(), "", 25);
nameLabel->setAnchorPoint(CCPointZero);
nameLabel->setPosition(ccp(cellSprite->getContentSize().width/2,cellSprite->getContentSize().height/2));
CCLog("%s",infomation->score.c_str());
CCLabelTTF* scoreLabel=CCLabelTTF::create(infomation->score.c_str(), "", 25);
scoreLabel->setAnchorPoint(CCPointZero);
scoreLabel->setPosition(ccp(cellSprite->getContentSize().width-70,cellSprite->getContentSize().height/2));
cellSprite->addChild(idxLabel);
cellSprite->addChild(nameLabel);
cellSprite->addChild(scoreLabel);
viewCell->addChild(cellSprite);
return viewCell;
}
unsigned int XmlParser::numberOfCellsInTableView(CCTableView *table)
{
return 10;
}
复制代码
运行效果如下:
11.png (50.58 KB, 下载次数: 31)
下载附件
保存到相册
1 小时前 上传
解析xml文件可以是使用第三方的开源库,这里我们谁用TinyXML,这里是这个库的下载地址http://sourceforge.net/projects/tinyxm
我们用的只有里面的两个头文件tinystr.h、tinyxml.h和4个cpp文件tinystr.cpp、tinycml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp,xml的解析主要是通过获取节点的方法来遍历整个文本,主要用到的是TiXmlNode、TiXmlElement和TiXmlAttribute(获取元素的属性)这三个类,其中TiXmlNode是TiXmlElement的父类,将这几个文件直接放在Classes里面就可以用了。例子中的用法和以前的例子做json解析类似,都是讲文本读到一个tableview上显示,具体看代码。
代码如下:
bool XmlParser::init()
{
if(!CCLayer::init())
{
return false;
}
dictionary=CCDictionary::create();
dictionary->retain();
size=CCDirector::sharedDirector()->getWinSize();
CCSprite* background=CCSprite::create("background.jpg");
background->setPosition(ccp(size.width*0.5,size.height*0.5));
this->addChild(background);
parseXml();
CCTableView* viewLayer=CCTableView::create(this, CCSizeMake(430, 600));
viewLayer->setAnchorPoint(ccp(0.5,0.5));
viewLayer->setDirection(kCCScrollViewDirectionVertical);
viewLayer->setVerticalFillOrder(kCCTableViewFillTopDown);
viewLayer->setPosition(ccp(background->getContentSize().width/2-220,background->getContentSize().height/2-400));
viewLayer->setContentOffset(ccp(0, 600-viewLayer->getContentSize().height));
viewLayer->setDelegate(this);
this->addChild(viewLayer);
return true;
}
void XmlParser::parseXml()//解析xml
{
int index=0;
GradeInfo* firstInfo=GradeInfo::getInstance();
std::string xmlFile=CCFileUtils::sharedFileUtils()->fullPathForFilename("perinfo.xml");
TiXmlDocument* xmlData=new TiXmlDocument(xmlFile.c_str());//初始化一个xml文档对象
xmlData->LoadFile();
TiXmlElement* rootNode=xmlData->RootElement();//每个xml文件对应一个唯一根节点,这里获取根节点。
CCLog("%s",rootNode->Value());
TiXmlElement* firstNode=rootNode->FirstChildElement();//获取根节点的第一个子节点
TiXmlElement* nameTag=firstNode->FirstChildElement();//获取第一个子节点的孩子节点
CCLog("%s",nameTag->GetText());
TiXmlElement* scoreTag=nameTag->NextSiblingElement();//获取孩子节点的兄弟节点(即同级节点,具体含义视获取这个节点的对象而定)
CCLog("%s",scoreTag->GetText());
firstInfo->name=nameTag->GetText();//得到节点的文本
firstInfo->score=scoreTag->GetText();
dictionary->setObject(firstInfo, 0);
for(firstNode=firstNode->NextSiblingElement();firstNode->NextSiblingElement()!=NULL;firstNode=firstNode->NextSiblingElement())//做一个遍历,从第二个子节点到倒数第二个子节点
{
index++;
GradeInfo* firstInfo=GradeInfo::getInstance();
TiXmlElement* nameTag=firstNode->FirstChildElement();
TiXmlElement* scoreTag=nameTag->NextSiblingElement();
firstInfo->name=nameTag->GetText();
CCLog("%s",nameTag->GetText());
firstInfo->score=scoreTag->GetText();
CCLog("%s",scoreTag->GetText());
dictionary->setObject(firstInfo, index);
}
index++;
TiXmlNode* lastNode=rootNode->LastChild();//这里再取出最后一个子节点
TiXmlElement* name=lastNode->FirstChildElement();
TiXmlElement* score=name->NextSiblingElement();
GradeInfo* lastInfo=GradeInfo::getInstance();
lastInfo->name=name->GetText();
lastInfo->score=score->GetText();
dictionary->setObject(lastInfo, index);//所有节点信息都保存在字典中
}
void XmlParser::scrollViewDidScroll(CCScrollView* view)
{
}
void XmlParser::scrollViewDidZoom(CCScrollView* view)
{
}
void XmlParser::tableCellTouched(CCTableView* table, CCTableViewCell* cell)
{
CCLog("This is number %d",cell->getIdx());
}
CCSize XmlParser::cellSizeForTable(CCTableView *table)
{
return CCSizeMake(500, 81);
}
CCTableViewCell* XmlParser::tableCellAtIndex(CCTableView *table, unsigned int idx)
{
CCTableViewCell* viewCell=new CCTableViewCell();
viewCell->autorelease();
viewCell->setAnchorPoint(CCPointZero);
viewCell->setPosition(CCPointZero);
CCSprite* cellSprite=CCSprite::create("cell.png");
cellSprite->setAnchorPoint(CCPointZero);
cellSprite->setPosition(CCPointZero);
GradeInfo* infomation=(GradeInfo*)dictionary->objectForKey(idx);
char num[5]="";
sprintf(num,"%d",idx);
CCLabelTTF* idxLabel=CCLabelTTF::create(num, "", 25);
CCLog("%s",num);
idxLabel->setAnchorPoint(CCPointZero);
idxLabel->setPosition(ccp(20,cellSprite->getContentSize().height/2));
CCLog("%s",infomation->name.c_str());
CCLabelTTF* nameLabel=CCLabelTTF::create(infomation->name.c_str(), "", 25);
nameLabel->setAnchorPoint(CCPointZero);
nameLabel->setPosition(ccp(cellSprite->getContentSize().width/2,cellSprite->getContentSize().height/2));
CCLog("%s",infomation->score.c_str());
CCLabelTTF* scoreLabel=CCLabelTTF::create(infomation->score.c_str(), "", 25);
scoreLabel->setAnchorPoint(CCPointZero);
scoreLabel->setPosition(ccp(cellSprite->getContentSize().width-70,cellSprite->getContentSize().height/2));
cellSprite->addChild(idxLabel);
cellSprite->addChild(nameLabel);
cellSprite->addChild(scoreLabel);
viewCell->addChild(cellSprite);
return viewCell;
}
unsigned int XmlParser::numberOfCellsInTableView(CCTableView *table)
{
return 10;
}
复制代码
运行效果如下:
11.png (50.58 KB, 下载次数: 31)
下载附件
保存到相册
1 小时前 上传
相关文章推荐
- Cocos2d-x tinyxml2用于xml的解析,自动生成xml文件和解析xml文件
- Cocos2d-x 深入解析系列 : 以XML文件方式保存用户数据--------------cocos2d-x3.0正式版本(7.13)
- Cocos2d-x解析XML文件,解决中文乱码
- Cocos2d-x 深入解析系列 : 以XML文件方式保存用户数据
- Cocos2d-x 3.0 使用TinyXml 解析XML文件
- Cocos2d-x 深入解析系列 : 以XML文件方式保存用户数据
- Cocos2d-x 深入解析系列 : 以XML文件方式保存用户数据
- cocos2d-x 3.0 使用Sax解析xml文件(中国显示器问题解决)
- Cocos2d-x] 使用TinyXml 解析XML文件
- 解析xml文件的几种技术
- struts2中的验证框架default.xml文件解析
- libxml2对XML文件的创建、解析、查找、修改
- 通过正则表达式实现简单xml文件解析
- 用JAXP的SAX方式解析XML文件
- JAVA SAX 方式解析XML文件
- cocos2d游戏术语解析
- XML文件的简单初步解析
- 用Dom4j解析xml文件
- 从url下载xml文件并解析(在流的状态直接解析)
- android解析xml文件的方式(其二)SAX