2013-06-27 4 views
1

Я пишу часть моего приложения, в которых хранятся настройки в файле XML, но я не хочу, чтобы «клиент» продублировать, я хочу это:предотвратить дублирование pugixml :: xml_node

<jack> 
    <client name="something"> 
    <port name="someport" /> 
    <port name="someport_2" /> 
    </client> 
</jack> 

Но вместо того, чтобы Я получаю:

<jack> 
    <client name="something"> 
    <port name="someport" /> 
    </client> 
    <client name="something"> 
    <port name="someport_2" /> 
    </client> 
</jack> 

думал «просто проверить, если узел уже существует», но это проблема, поэтому я этот кусок кода:

// xjack is the root node 
pugi::xml_node xclient = xjack.child(sclient.c_str()); 
if (!xclient) { 
    xclient = xjack.append_child("client"); 
} 

номе t !xclient всегда оценивает true, попробовал также if (xclient.empty()), но не работает также.

+0

Как sclient инициализируется? – zeuxcg

+0

Он инициализируется в цикле, который является результатом другого строкового substr, 'sclient = client-> first.substr (0, client-> first.find (':'));' client-> first - это строка в формате " что-то: someport» –

ответ

1

думать о комментариях zeuxcg Я мог бы выяснить, что случилось.

pugi::xml_node xclient = xjack.child(sclient.c_str()); ищет ребенка с именем «что-то», которого на самом деле не существует, то, что я ищу, является тегом с именем «клиент» и атрибутом «имя» со значением «что-то».

Таким образом, правильным является:

pugi::xml_node xclient = xjack.find_child_by_attribute("client", "name", sclient.c_str()); 
if (!xclient) { 
    xclient = xjack.append_child("client"); 
    xclient.append_attribute("name").set_value(sclient.c_str()); 
} 
Смежные вопросы