各位程序员,
我搜索了论坛,但找不到我的问题的答案。
我正在尝试使用 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 数据,以便避免这两个错误吗?
谢谢萨韦什