【问题标题】:Input from xml file and parsing using rapidxml从 xml 文件输入并使用 rapidxml 解析
【发布时间】:2012-08-04 16:27:16
【问题描述】:

我正在尝试使用 rapidxml 使用 c++ 来做这样的事情

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

并收到以下错误

此行有多个标记 - 无效参数 ' 候选者是:void parse(char *) ' - 无法解析符号 'parse'

文件大小可达几兆字节。

请帮忙

【问题讨论】:

    标签: c++ eclipse rapidxml


    【解决方案1】:

    您必须首先按照官方文档中的说明将文件加载到以空字符结尾的字符缓冲区中。

    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 的文档以了解详细信息。无论如何,这应该可以帮助您入门。

    【讨论】:

    • 嘿,非常感谢它的工作。但并不完美。有时它工作正常,缓冲区完美地从文件中获取输入,但有时它在缓冲区的末尾有一些垃圾值,那就是语句 doc.parse(buffer);失败并在运行不编译时给出以下错误。 “此应用程序已请求运行时以不寻常的方式终止它。请联系应用程序的支持团队以获取更多信息。在抛出 'rapidxml::parse_error' 的实例后调用终止 what(): 预期
    • 是的,您需要从解析中捕获异常。如果您的文件中有一些意外的垃圾,解析可能会引发错误。如果您使用 try/catch 块来捕获该错误并进行处理。并且不要忘记,当您将文件读入字符缓冲区时,您应该确保缓冲区为零终止,如文档所述。这意味着将缓冲区创建为比文件大小大一字节,mem 将整个缓冲区设置为零,然后将文件读入缓冲区。当然,如果您的 xml 文件包含错误,那么您无能为力 - 这就是引发异常的原因
    • 非常感谢 mathematician1975。问题在于缓冲区的零终止。最后我将最后一个字符设置为零并且它起作用了。
    • @jj1 很高兴为您提供帮助。如果您还没有,请仔细查看上面链接中的文档。里面有很多有用的东西。
    猜你喜欢
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 2013-08-27
    • 2013-02-21
    • 1970-01-01
    • 2020-01-18
    • 2013-02-22
    • 2015-05-24
    相关资源
    最近更新 更多