使用pugixml解析XML文件

时间:2011-05-24 16:55:15

标签: c++ xml parsing xml-parsing

您好 我想使用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.有人可以告诉我我做错了吗?

3 个答案:

答案 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()

至少这是我的做法!