仲間のプログラマー、
フォーラムを検索しましたが、私の問題に対する答えが見つかりませんでした。
expat を使用して C で 2 GB の xml ファイルを解析しようとしています。コードの抜粋です (問題に関係のない部分のほとんどを削除しました)。
void main(int argc, char **argv) {
XML_Parser p = XML_ParserCreate(NULL);
FILE *fp;
fp = fopen("/dev/shm/GNBIExport_XML_RT_06_11_2015_07_48_53_953_10_100_5_153.xml","r");
XML_UseParserAsHandlerArg(p);
XML_SetElementHandler(p, start_hndl, end_hndl);
XML_SetCharacterDataHandler(p, char_hndl);
char buffer[10000000];
memset(buffer,0,10000000);
size_t file_size=0;
file_size=fread(buffer,sizeof(char),10000000,fp);
while(file_size != 0 ){
if ( XML_Parse(p,buffer,strlen(buffer),XML_FALSE) == XML_STATUS_ERROR ){
printf("Encountered error\n");
exit(-1);
}
file_size=fread(buffer,sizeof(char),10000000,fp);
}
}
ご覧のとおり、ファイルから読み取り、サイズ 10000000 のバッファーに入れています。
私の問題は、不正な形式の XML エラーまたはタグの不一致エラーが時々発生することです。私の理解では、xmlファイルは巨大であるため、データがバッファに読み込まれると、バッファに開始タグが存在するバッファに終了タグを含めることができない可能性があります.たとえばxmlのような完全なタグを読み取ることは
<Transmission> <BTSTEMPLATERSC> <attributes><TEMPLATENAME>defaultOfBTS30</TEMPLATENAME></attributes> </BTSTEMPLATERSC>
およびバッファ読み取りのみ
<Transmission> <BTSTEMPLATERSC> <attributes><TEMPLATENAME>defaultOfBTS30</TEMPLATENAME></attributes> </BTSTEMPL
BTSTEMPLATERSC タグが完全ではないため、不正な形式の xml エラーが発生します。
それで、これら2つのエラーを回避できるように、xmlデータのチャンクを正しく読み取る方法を教えてください。
ありがとう