プロが教える店舗&オフィスのセキュリティ対策術

C言語にてXMLファイルからタブで囲まれた任意部分の文字列だけを抽出したいのですが、どうやればいいでしょうか?
サンプルなどありましたらありがたいです。

 <aaa>
  <bbb>123/bbb>
  <ccc>あああ</ccc>
  <bbb>456</bbb>
  <ccc>いいい</ccc>
 </aaa>

・抽出したいのは、<bbb></bbb>と<ccc></ccc>で囲まれた文字列。
・大量データの場合もあるので抽出性能は考慮したい。(基本はメモリ上で操作したい。)

A 回答 (5件)

<bbb>とか<ccc>とかが<bbb>こんなふうに<ccc>ネストしてたりすると</ccc>どうしようかと</bbb>わりと悩ましかったり</ccc>するかもしれない</bbb>


と遊んでみる.

とりあえず... メモリマップトファイル (memory mapped file)?
    • good
    • 0

#3:


> while( NULL != fgets( cBuf, 128, fp ) ){
>   nn = CyuuSyutsu( "<bbb>", "</bbb>", cBuf );

<bbb>途中の改行を考慮しなくていいなら
これで十分ですわね。</bbb>
    • good
    • 0

>・抽出したいのは、<bbb></bbb>と<ccc></ccc>で囲まれた文字列。



 これを
 ・抽出したいのは、<bbb>と</bbb>または<ccc>と</ccc>で囲まれた文字列、として

 例での結果は、

  あああ
  456
  いいい

 となる、とした場合のサンプルです。

注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int CyuuSyutsu( char cTop[], char cBtm[], char cBuf[] )
{
 char *pT, *pB;

 pT = strstr( cBuf, cTop );
 pB = strstr( cBuf, cBtm );

 if( NULL == pT ) return( 0 );
 if( NULL == pB ) return( 0 );

 *pB = '\0';

 return( pT - cBuf + strlen( cTop ) );
}
int main()
{
 int nn;
 char cBuf[ 128 ];
 FILE *fp;

 fp = fopen( "Z:/test.txt", "r" );

 while( NULL != fgets( cBuf, 128, fp ) ){

  nn = CyuuSyutsu( "<bbb>", "</bbb>", cBuf );

  if( nn ) fprintf( stderr, "%s\n", &cBuf[ nn ] );

  nn = CyuuSyutsu( "<ccc>", "</ccc>", cBuf );

  if( nn ) fprintf( stderr, "%s\n", &cBuf[ nn ] );
 }
 fclose( fp );

 return( 0 );
}
    • good
    • 2

Cならlibxml2でXPath使うとか。

    • good
    • 0

Cであることは譲れない条件ですか?


C++ならApache Xercesあたりを使うのが定番ですが。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!