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);}

这样我们就很轻松的把一个复杂的问题简单(当然可定还有更好的方法  =  =)

转换称自己想要的对象



















原创粉丝点击