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

こんな感じでうまく動きました。
いや〜よかったよかった。