您好 我想使用XML文件作为配置文件,我将从中读取应用程序的参数。我遇到了PugiXML库,但是我遇到了获取属性值的问题。 我的XML文件看起来像那样
<?xml version="1.0"?>
<settings>
<deltaDistance> </deltaDistance>
<deltaConvergence>0.25 </deltaConvergence>
<deltaMerging>1.0 </deltaMerging>
<m> 2</m>
<multiplicativeFactor>0.7 </multiplicativeFactor>
<rhoGood> 0.7 </rhoGood>
<rhoMin>0.3 </rhoMin>
<rhoSelect>0.6 </rhoSelect>
<stuckProbability>0.2 </stuckProbability>
<zoneOfInfluenceMin>2.25 </zoneOfInfluenceMin>
</settings>
要削减XML文件,我使用此代码
void ReadConfig(char* file)
{
pugi::xml_document doc;
if (!doc.load_file(file)) return false;
pugi::xml_node tools = doc.child("settings");
//[code_traverse_iter
for (pugi::xml_node_iterator it = tools.begin(); it != tools.end(); ++it)
{
cout<<it->name() << " " << it->attribute(it->name()).as_double();
}
}
我也试图用这个
void ReadConfig(char* file)
{
pugi::xml_document doc;
if (!doc.load_file(file)) return false;
pugi::xml_node tools = doc.child("settings");
//[code_traverse_iter
for (pugi::xml_node_iterator it = tools.begin(); it != tools.end(); ++it)
{
cout<<it->name() << " " << it->value();
}
}
属性是corectly加载的,但所有值都等于0.有人可以告诉我我做错了吗?
答案 0 :(得分:7)
我认为您的问题是您希望将值存储在节点本身中,但它实际上位于CHILD文本节点中。快速扫描文档表明您可能需要
it->child_value()
而不是
it->value()
答案 1 :(得分:1)
您是尝试获取给定节点的所有属性还是要按名称获取属性?
对于第一种情况,您应该能够使用此代码:
unsigned int numAttributes = node.attributes();
for (unsigned int nAttribute = 0; nAttribute < numAtributes; ++nAttribute)
{
pug::xml_attribute attrib = node.attribute(nAttribute);
if (!attrib.empty())
{
// process here
}
}
对于第二种情况:
LPCTSTR GetAttribute(pug::xml_node & node, LPCTSTR szAttribName)
{
if (szAttribName == NULL)
return NULL;
pug::xml_attribute attrib = node.attribute(szAttribName);
if (attrib.empty())
return NULL; // or empty string
return attrib.value();
}
答案 2 :(得分:1)
如果您想将纯文本数据存入节点,如
<name> My Name</name>
你需要像
一样rootNode.append_child("name").append_child(node_pcdata).set_value("My name");
如果要存储数据类型,则需要设置属性。我想你想要的是能够直接读取这个值吗?
编写节点时,
rootNode.append_child("version").append_attribute("value").set_value(0.11)
如果您想阅读,
rootNode.child("version").attribute("version").as_double()
至少这是我的做法!