使用C语言中的Expat进行解析,如何从xml文档中读取正确数量的块

时间:2016-02-19 09:42:49

标签: c xml expat-parser

研究员,

我搜索了论坛,但找不到我的问题的答案。

我正在尝试使用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错误,因为而不是像xml那样读取完整的标记

<Transmission>  <BTSTEMPLATERSC> <attributes><TEMPLATENAME>defaultOfBTS30</TEMPLATENAME></attributes> </BTSTEMPLATERSC>

和缓冲区只读

<Transmission>  <BTSTEMPLATERSC> <attributes><TEMPLATENAME>defaultOfBTS30</TEMPLATENAME></attributes> </BTSTEMPL

BTSTEMPLATERSC标记未完成,因此我收到格式错误的xml错误。

那么,有人可以帮助我知道如何正确读取一大块xml数据,以便可以对这两个错误进行搜索?

由于 Sarwesh

0 个答案:

没有答案