C/400

54. これは便利な文字列を切り出す strtok (2)

strtok の、もうひとつの使用方法をさらに進んで紹介しよう。
C/400 で HTML を解析するのにタグに分割したり、特定のタグだけを
抽出したい場合がある。
タグに分割するだけなら、前章で紹介したように文字「<」によって
strtok によって HTMLタグをトークンに分解すればよいことになる。
ここでは一歩進んで特定のタグだけを抽出することを目的としている。

"<TABLE><PCM> 田中太郎 </PCM><PCM> 山本花子 </PCM></TABLE>"

に対して <PCM> .... </PCM> で囲まれたタグの内容だけを抽出することが
目的である。
以下にサンプル・ソースを紹介する。

【 サンプル 】
0001.00 #include <stdio.h>                                                 
0002.00 #include <stdlib.h>                                                
0003.00 #include <string.h>                                                
0004.00                                                                    
0005.00 #define TRUE         0                                             
0006.00 #define FALSE       -1                                             
0007.00 void main(void){                                                   
0008.00   char  buff[128], b_buff[128];                                    
0009.00   char* tokenPtr;                                                  
0010.00   int   pos;                                                       
0011.00                                                                    
0012.00   printf("** TESTTOK **\n");                                       
0013.00   getchar();                                                       
0014.00   memset(buff, 0, sizeof(buff));                                   
0015.00   strcpy(buff,                                                     
0016.00     "<TABLE><PCM> 田中太郎 </PCM><PCM> 山本花子 </PCM></TABLE>");  
0017.00   memset(b_buff, 0, sizeof(b_buff));                               
0018.00   strcpy(b_buff, buff);                                            
0019.00   printf("buff = %s\n", buff);                                     
0020.00   tokenPtr = strtok(buff, "<PCM>");                                
0021.00   if(tokenPtr != NULL) tokenPtr = strtok(NULL, "<PCM>");           
0022.00   while(tokenPtr != NULL){/*while*/                                
0023.00     pos = (int)(tokenPtr - buff);                                  
0024.00     if(strstr(&b_buff[pos], "</PCM>") != NULL)   
0025.00       printf("  tokenPtr = [%s]\n", tokenPtr);   
0026.00     tokenPtr = strtok(NULL, "</PCM>");           
0027.00   }/*while*/                                     
0028.00   printf("**** END OF TOKEN ***\n");             
0029.00   getchar();                                     
0030.00 }                                                
【 実行結果 】
   ** TESTTOK **                                                    
 >                                                                  
   buff = <TABLE><PCM> 田中太郎 </PCM><PCM> 山本花子 </PCM></TABLE> 
     tokenPtr = [ 田中太郎 ]                                        
     tokenPtr = [ 山本花子 ]                                        
   **** END OF TOKEN ***    
【 解説 】

この strtok の使用はいろいろな場面で応用することができる。
筆者がこの strtok の使用を必要としたのはWSDL から XMLタグを切り出して
SOAP プロトコルを生成するための XML パーサーを開発するためである。
この strtok の利用は XML に対して XML のタグを切り出すこともできる。
このようなタグを切り出すプログラムのことを「パーサー」と呼ぶ。
XMLタグを切り出すプログラムのことは「XMLパーサー」と呼ばれる。
Webサービスとは SOAP という XML記述のプロトコルによって
インターネット上でプログラムどうしが通信するための記述のことである。
SOAP プロトコルは WSDL と呼ばれるXMLで書かれた通信仕様をプログラムが
解釈して SOAP プロトコルとして抽出される。
つまり Webサービスの基本となるのが WSDL であり、WSDL から SOAP プロトコルを
生成するためには XMLパーサーが必要である。
strtok は XMLパーサーを開発するための基礎技術というわけである。