1 /********************************************************
2 This sample demonstrates how to use the XMLParser
3 class to parse an XML communication protocol and
4 update model objects accordingly.
5 ********************************************************/
30 List<Track> tracks { };
32 TrackXMLParser parser { };
34 class TrackingSocket : Socket
36 unsigned int OnReceive(unsigned char * buffer, unsigned int count)
38 parser.Parse(buffer, count);
45 class TrackXMLParser : XMLParser
49 void ProcessKeyword(char * keyWord)
51 if(!strcmpi(keyWord, "object"))
58 if(!strcmpi(keyWord, "id")) { GetWord(); id = CopyString(keyWord); }
59 else if(!strcmpi(keyWord, "type")) { GetWord(); type = (ObjectType)atoi(keyWord); }
60 else if(!strcmpi(keyWord, "desc")) { GetWord(); desc = CopyString(keyWord); }
64 if(!strcmp(object.id, id)) break;
69 object.description = desc;
73 tracks.Add({ id = id, type = type, description = desc });
77 else if(!strcmpi(keyWord, "/object"))
81 else if(!strcmpi(keyWord, "pos"))
83 Vector3Df position { };
86 if(!strcmpi(keyWord, "x")) { GetWord(); position.x = (float)atof(keyWord); }
87 else if(!strcmpi(keyWord, "y")) { GetWord(); position.y = (float)atof(keyWord); }
88 else if(!strcmpi(keyWord, "z")) { GetWord(); position.z = (float)atof(keyWord); }
89 else if(!strcmpi(keyWord, "speed")) { GetWord(); object.speed = (float)atof(keyWord); }
90 else if(!strcmpi(keyWord, "dir")) { GetWord(); object.direction = (float)atof(keyWord); }
92 object.position = position;
105 class MyParser : XMLParser
109 void ProcessCharacterData(char * data)
113 case myTag1: PrintLn("myTag1: ", data); break;
114 case myTag2: PrintLn("myTag2: ", data); break;
115 case myTag3: PrintLn("myTag3: ", data); break;
119 void ProcessKeyword(char * keyWord)
122 EnumClassData tagData = class(MyTag).data;
123 for(nl = tagData.values.first; nl; nl = nl.next)
125 if(!strcmpi(keyWord, nl.name))
127 MyTag curTag = (MyTag)nl.data;