Boost XML解析:如何将文件路径作为变量传入read_xml()?
解决Boost read_xml()无法识别Windows完整路径的问题
这问题我之前踩过坑!核心原因是Windows路径里的反斜杠在C++字符串中是转义字符,你直接写"C:\Users\serhan.erkovan\Desktop\ddd.xml"时,编译器会把\s、\D这类组合当成转义序列处理,导致实际传给read_xml()的路径已经被篡改,自然找不到文件。
下面给你几个靠谱的解决方案:
方案1:用双反斜杠转义路径
在C++字符串里,要表示一个实际的反斜杠,必须写成两个反斜杠\\,这样编译器才会把它解析成单个路径分隔符:
ptree pt; try { read_xml("C:\\Users\\serhan.erkovan\\Desktop\\ddd.xml", pt); } catch (const boost::property_tree::xml_parser::xml_parser_error &ex) { cerr << ex.what(); }
方案2:用C++11+的原始字符串(推荐)
如果觉得双反斜杠写起来麻烦,可以用C++11引入的原始字符串语法,前面加R并用括号包裹内容,里面的反斜杠不需要转义:
ptree pt; try { read_xml(R"(C:\Users\serhan.erkovan\Desktop\ddd.xml)", pt); } catch (const boost::property_tree::xml_parser::xml_parser_error &ex) { cerr << ex.what(); }
方案3:改用正斜杠作为路径分隔符
Windows系统完全支持正斜杠/作为路径分隔符,这样既不用转义,代码还能兼容Linux/macOS等其他平台:
ptree pt; try { read_xml("C:/Users/serhan.erkovan/Desktop/ddd.xml", pt); } catch (const boost::property_tree::xml_parser::xml_parser_error &ex) { cerr << ex.what(); }
把路径存成变量传入的正确写法
如果要把路径放到变量里再传入,只要按照上面的任意一种方式定义变量即可:
#include <string> // ... std::string xml_file_path = "C:\\Users\\serhan.erkovan\\Desktop\\ddd.xml"; // 或者用原始字符串:std::string xml_file_path = R"(C:\Users\serhan.erkovan\Desktop\ddd.xml)"; // 或者正斜杠:std::string xml_file_path = "C:/Users/serhan.erkovan/Desktop/ddd.xml"; ptree pt; try { read_xml(xml_file_path, pt); } catch (const boost::property_tree::xml_parser::xml_parser_error &ex) { cerr << ex.what(); }
另外补充一句:你直接传"ddd.xml"能运行,是因为程序的工作目录正好和文件所在目录一致(比如你在Desktop目录下运行程序),但这种写法不通用,换个目录运行就会报错,所以还是用完整路径更稳妥。
内容的提问来源于stack exchange,提问作者Serhan Erkovan
相关产品推荐
相关产品推荐

