Parsin XML-файл с использованием pugixml - PullRequest
2 голосов
/ 24 мая 2011

Привет Я хочу использовать 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. Может кто-нибудь сказать мне, что я делаю неправильно?

Ответы [ 3 ]

7 голосов
/ 24 мая 2011

Я думаю, что ваша проблема в том, что вы ожидаете, что значение будет храниться в самом узле, но на самом деле это текстовый узел CHILD. Быстрый просмотр документации показал, что вам может понадобиться

it->child_value()

вместо

it->value()
1 голос
/ 11 декабря 2012

Если вы хотите поместить данные простого текста в такие узлы, как

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

По крайней мере, это мой способ сделать это!

1 голос
/ 24 мая 2011

Вы пытаетесь получить все атрибуты для данного узла или хотите получить атрибуты по имени?

Для первого случая вы должны использовать этот код:

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