如何使用 pugixml 正确访问 xml 属性?



我是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;
}

这将捕获错误的解析并将错误记录到控制台。

相关内容

  • 没有找到相关文章

最新更新