XMLパーサー
XMLパーサのexpatを使ってパース
イベントハンドラの登録
//開始タグで実行、タグ内のデータをゲット //userDataにXML_SetUserDataでセットしたポインタが入る(end,dataも) void element_start(void *userData, const XML_Char *name, const XML_Char *atts[]) { printf("[ELEMENT] %s Start! \n", name); for (int i = 0; atts[i]; i += 2) { char temp_string[256]; sprintf(temp_string, " Attribute %s='%s'\n", atts[i], atts[i + 1]); printf("[ELEMENT] Data %s \n",temp_string); } } //閉じタグがあった際に実行 void element_end(void *userData, const XML_Char *name) { printf("[ELEMENT] %s End!\n", name); } //タグ以外のデータが来たときに実行 void element_data(void *userData,const XML_Char *data, int len){ string str; str.append(data,len); printf("%s\n",(char*)str.c_str()); }
パース作業
//パーサーを作る XML_Parser parser; if ((parser = XML_ParserCreate(NULL)) == NULL) { printf("parser creation error\n"); XML_ParserFree(parser); return NPC_ERR_PARSE; } //イベントハンドラを登録 XML_SetElementHandler(parser, element_start, element_end); XML_SetCharacterDataHandler(parser, element_data); XML_SetUserData(parser, (void *)渡したいポインタ ); //レッツパース! if ((XML_Parse(parser, XMLデータ , strlen(XMLデータ) , 1)) == 0) { printf( "parser error\n"); XML_ParserFree(parser); return NPC_ERR_PARSE; } //かたづけ XML_ParserFree(parser);
こんな感じでうまく動きました。
いや〜よかったよかった。