【问题标题】:Parsin XML file using pugixml使用 pugixml 解析 XML 文件
【发布时间】:2011-09-01 02:57:29
【问题描述】:

嗨 我想使用 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();
    }

}

属性是正确加载的,但是所有值都等于 0。有人可以告诉我我做错了什么吗?

【问题讨论】:

  • 欢迎来到 SO。要正确使用 XML 格式,只需确保缩进至少 4 个空格(或使用编辑器中的 {} 按钮)

标签: c++ xml parsing xml-parsing


【解决方案1】:

我认为您的问题是您希望将值存储在节点本身中,但它实际上是在 CHILD 文本节点中。快速浏览文档表明您可能需要

it->child_value()

而不是

it->value()

【讨论】:

    【解决方案2】:

    您是要获取给定节点的所有属性,还是要按名称获取属性?

    对于第一种情况,您应该可以使用以下代码:

    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();
    }
    

    【讨论】:

      【解决方案3】:

      如果您想将纯文本数据存储到节点中,例如

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

      至少我是这样做的!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-28
        • 1970-01-01
        • 1970-01-01
        • 2021-03-27
        • 2012-07-15
        • 2013-05-29
        • 2012-12-16
        相关资源
        最近更新 更多