我是xml的新手,使用pugixml文档,我无法将节点属性读取到控制台。问题的核心是我不明白节点访问结构的工作原理,并且我无法使用我的代码弄清楚。
提供的代码是从实际的 pugixml 手册中略微修改的一行,所以我不确定为什么它不起作用。
XML 文件已加载
<?xml version="1.0" encoding="utf-8"?>
<settings description="settings root description">
<!--settings for the options menu-->
<options description="game options">
<resolution description="resolution in 16:9 ratio">6</resolution>
<volume description="volume setting">0</volume>
</options>
</settings>
C++尝试使用 XML 文件的代码
//set up and load settings xml doc
pugi::xml_document settingsXML;
pugi::xml_parse_result settingsResult = settingsXML.load_file("SFMLVania/include/Settings.xml");
std::cout << "Root description: " << settingsXML.root().attribute("description").as_string();
我期待看到: "根描述:设置根描述" 在控制台中。
相反,我得到的是: "根描述:">
第二次尝试 - 尝试获取任何数据并找出我在树中的位置:
std::cout << "Second attempt: " << settingsXML.first_attribute().as_string();
我从第二次尝试中得到的只是控制台吐出:"第二次尝试:">
事实证明,我的加载路径不存在,我忘记使用../转到一个目录并离开存储.exe的 Debug 文件夹。我通过测试可以作为布尔值传递的加载结果来解决这个问题。
if (settingsResult)
{
std::cout << "returned truen";
}
else
std::cout << "returned falsen";
if (!settingsResult)
{
std::cout << "also returned falsen";
}
我包含了一些冗余的返回,以防布尔值无法按预期运行。
结果显示没有加载文件(它返回 false(,当我重新检查我的文件结构并添加 ../作为对文件路径的测试,它返回 true。
对于遇到此问题的任何人,您可以通过在分配settingsResult
后添加最小的解析检查来防止此错误,如下所示:
pugi::xml_document settingsXML;
pugi::xml_parse_result settingsResult = settingsXML.load_file("SFMLVania/include/Settings.xml");
// Catch parsing error
if (!settingsResult )
{
std::cout << "ERROR: " << settingsResult.description() << 'n';
return -1;
}
这将捕获错误的解析并将错误记录到控制台。