tinyxml2实际运用的一类场景
来源:互联网 发布:linux shell 复制一行 编辑:程序博客网 时间:2024/04/28 11:43
在某些情况下我们接口无法满足或者很难满足我们的一些需求,特别是有时候跨语言性的交互对复杂对象的传递
我们在玩手机游戏的时候,有时候在新手指导里面我们经常看到这样一个句子
小伙伴们经过装备强化可以变得更加厉害哟
当需要突出高亮 “装备强化”四个字 而且这种突出性的文字你不知道是具体哪一段或者一句话中有多少这样的高亮文字
比如: 攻打试练塔可以更多的得到水晶,来购买紫色防具
这种场景问题或者类似的问题我们都可以用以下方法解决
tinyxml2给我们提供了一个代理的类tinyxml2::XMLVisitor
我们可以把它继承下来按照我们自己想要的实现
这个机制有点像cocos2dx 里面的tableview的实现方式一样
我们把需求语句写成xml格式字符串,这样做的好处的我们只需要一个字符串接口就可以了
我们写一个xml
<?xml version=\"1.0\" encoding=\"utf-8\"?><font color = "#F8F8FF">你</font><font color = "#DC143C">非常</font><font color = "#F8F8FF">美丽</font></xml>
然后我们可以先定一个对象来表示里面的标签
struct TextInfo{public:TextInfo() {clear();};void clear() {strText = ""; color = Color3B(255, 255, 255); //文本段落的颜色};std::string strText; //文本段落的内容Color3B color; //文本段落的颜色};
继承自tinyxml2::XMLVisitor的类
class MyVisitor : public tinyxml2::XMLVisitor{public:MyVisitor() {m_color = Color3B(255, 255, 255);};inline std::vector<TextInfo>& getInfoVec() {return m_vecTextinfo;};public:/// Visit a document.virtual bool VisitEnter(const tinyxml2::XMLDocument& doc) {return true;}/// Visit a document.virtual bool VisitExit(const tinyxml2::XMLDocument& doc) {return true;}/// Visit an element.virtual bool VisitEnter(const tinyxml2::XMLElement& element, const tinyxml2::XMLAttribute* firstAttribute) {std::string name = element.Name();if (name != "font") {return true;}Color3B color;const tinyxml2::XMLAttribute* attr = firstAttribute;while (attr) {std::string colorname = attr->Name();if (colorname == "color") {if (attr->Value() != "") {std::string hexstring = attr->Value();std::string strd = hexstring.erase(0, 1);const char *strs = NULL;strs = strd.c_str();int number = (int)strtol(strs, NULL, 16);int r = (number >> 16) & 0xff;int g = (number >> 8) & 0xff;int b = number & 0xff;color.r = r;color.g = g;color.b = b;}break;}attr = attr->Next();}m_textInfo.color = color;return true;}/// Visit an element.virtual bool VisitExit(const tinyxml2::XMLElement& element) {return true;}/// Visit a declaration.virtual bool Visit(const tinyxml2::XMLDeclaration& declaration) {return true;}/// Visit a text node.virtual bool Visit(const tinyxml2::XMLText& text) {m_textInfo.strText = text.Value();m_vecTextinfo.push_back(m_textInfo);m_textInfo.clear();return true;}/// Visit a comment node.virtual bool Visit(const tinyxml2::XMLComment& comment) {return true;}/// Visit an unknown node.virtual bool Visit(const tinyxml2::XMLUnknown& unknown) {return true;}private:Color3B m_color; //文字段落的颜色std::vector<TextInfo> m_vecTextinfo; //我们自己定义的对象的数组TextInfo m_textInfo;};
接下来我么就可以实际的运用了
tinyxml2::XMLDocument docz;tinyxml2::XMLError err;MyVisitor visitor;FILE* fp = fopen("test3.xml", "r"); /*<?xml version=\"1.0\" encoding=\"utf-8\"?> <font color = "#F8F8FF">你</font> <font color = "#DC143C">非常</font> <font color = "#F8F8FF">美丽</font> </xml>*/int size = 0;unsigned char * buffer = nullptr;if (!fp){return;}do{fseek(fp, 0, SEEK_END);size = ftell(fp);fseek(fp, 0, SEEK_SET);buffer = (unsigned char*)malloc(size);size = fread(buffer, sizeof(unsigned char), size, fp);fclose(fp);} while (0);err = docz.Parse((const char *)buffer);if (err == tinyxml2::XML_SUCCESS){docz.Accept(&visitor);std::vector<TextInfo> infovec = visitor.getInfoVec();int size = infovec.size();for (int i = 0; i < size;i++){std::string str = infovec[i].strText;Color3B color = infovec[i].color;log("%s color r=%d,g=%d,b=%d", str.c_str(), color.r, color.g, color.b);}}free(buffer);}
这样我们就很轻松的把一个复杂的问题简单(当然可定还有更好的方法 = =)
转换称自己想要的对象
阅读全文
1 0
- tinyxml2实际运用的一类场景
- tinyxml2的简单运用
- memcache实际运用场景
- activemq应用场景-公司实际运用举例
- fusioncharts的实际运用
- AcionBar的实际运用
- 个人对Redis pub/sub机制在实际运用场景的理解
- 理解bind与call,apply区别及其在实际项目中部分场景的运用
- runTime运用的场景
- 多线程的运用场景
- hash算法的实际运用
- 命令模式在Android实际场景中运用
- Scala的实际应用场景
- Nosql的实际应用场景
- IntentService的实际应用场景
- Nosql的实际应用场景
- Runtime的实际使用场景
- Redis pub/sub机制在实际运用场景的缺陷&&模拟JMS消息发布订阅的持久化特性
- Linux学习网站推荐
- Java中 extends A, B
- 总结/AS
- curl 下载文件失败 如何排错
- Gson 复杂数据解析
- tinyxml2实际运用的一类场景
- java面向对象
- Java/Android将byte[]读入文件
- Chirp扩频简介
- 类
- Java判断当前使用语言
- Java删除指定文件或者文件夹
- iOS之MJRefresh下拉刷新和上啦加载更多实例
- solr 运行日志