2012-08-04 57 views
1

我想用C++输入和使用rapidxml

xml_document<> doc; 
ifstream myfile("map.osm"); 
doc.parse<0>(myfile); 

在这一行做这样的事情使用rapidxml并收到以下错误

多个标记解析 - 参数无效“考生:void parse(char *)' - Symbol'parse'无法解析

文件大小可能高达几兆字节。

请帮助

回答

0

你必须将文件加载到一个null作为这里的官方文档中指定的第一个终止字符缓冲区。

http://rapidxml.sourceforge.net/manual.html#classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c

刚刚看了你的文件的内容到一个char数组,使用这个数组传递给xml_document::parse()功能。

如果您正在使用ifstream,你可以使用类似下面的读取整个文件内容的缓冲区

ifstream file ("test.xml"); 
if (file.is_open()) 
{ 
    file.seekg(0,ios::end); 
    int size = file.tellg(); 
    file.seekg(0,ios::beg); 

    char* buffer = new char [size]; 

    file.read (buffer, size); 
    file.close(); 

    // your file should now be in the char buffer - 
    // use this to parse your xml  

    delete[] buffer; 
} 

请注意,我还没有编译上面的代码,只是从内存中写,但这是粗略的想法。有关确切的详细信息,请参阅ifstream的文档。无论如何,这应该有助于你开始。

+0

嘿,非常感谢它的工作。但并不完美。有些时候它工作正常,并且缓冲区完全从文件获取输入,但有些时候它在缓冲区末尾有一些垃圾值,这是语句 doc.parse <0>(buffer); 失败,并在运行未编译时出现以下错误。 “此应用程序已请求运行时终止它在一个不寻常的方式 请与应用程序的支持团队以获取更多信息 终止叫做抛出‘rapidxml :: PARSE_ERROR’ 什么()的一个实例之后:预期<” 请帮忙 – 2012-08-05 18:06:33

+0

是的,你需要从解析中捕捉异常。如果你的文件中有一些意外的垃圾,解析会抛出错误。如果您使用try/catch块来捕获该错误并处理它。并且不要忘记,当你将文件读入char缓冲区时,应该确保缓冲区像文档所说的那样终止。这意味着将缓冲区创建为比文件大一个字节,将整个缓冲区memset设为零,然后将文件读入缓冲区。当然,如果你的xml文件包含错误,那么你就无能为力 - 这就是为什么这个异常抛出 – mathematician1975 2012-08-05 19:09:57

+0

感谢很多数学家1975。问题在于缓冲区的零终止。我在最后将最后一个字符设置为零,它工作。 – 2012-08-06 10:33:28