Я пишу часть своего приложения, которая хранит настройки в XML-файле, но я не хочу дублировать «клиента», я хочу это:
<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");
}
но !xclient
всегда оценивать как истину, пробовал также if (xclient.empty())
но не работа тоже.
думая о комментариях 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());
}
Других решений пока нет …