Удаление узла на основе дочернего значения в Pugixml - PullRequest
0 голосов
/ 13 июня 2018

То, что у меня есть, может удалить все дочерние элементы фактического узла, который я хочу удалить, но не сам узел.

pugi::xml_document doc;
pugi::xml_parse_result result = doc.load_file("config/config.xml");
pugi::xpath_query query_network_last_run("//state[network/network_last_run='2']");
pugi::xpath_node_set network_last_run = query_network_last_run.evaluate_node_set(doc);

В приведенной ниже части удаляются определенные части, но я хочу удалить сеть основана на дочернем значении (network_last_run), а не на этом дочернем.

network_last_run[0].node().remove_child("network_gateway");

Структура файла XML

<root>
 <state>
  <network>
   <network_last_run>2<network_last_run>
   <network_gateway>192.168.3.1</network_gateway>
  </network>
 </state>
</root>

Я попытался сделать шаг назад, используя

network_last_run[0].node().parent().remove_child("network");

Но, похоже, изменяет только фактическую структуру, хранящуюся в памяти (удаляет первую), а не структуру, имеющуюся в запросе.

Возможно, я мог бы сделать это в цикле for и использовать условие if, чтобы проверить, соответствует ли значение дочернего узла, но я хотел бы сделать это с помощью запроса, если это возможно?

1 Ответ

0 голосов
/ 13 июня 2018

Немного поиграв с этим, я принял это решение (и нигде не смог найти ответ на этот вопрос, поэтому решил, что могу просто опубликовать его здесь)

По сути, это меняетимя фактического узла в вопросе.После этого он выполняет запрос (набор узлов которого может использоваться в цикле for) и удаляет все дочерние элементы с новым именем.

network_last_run[0].node().set_name("removal");



pugi::xpath_query query_removals("//state");
pugi::xpath_node_set removals = query_removals.evaluate_node_set(doc);

removals[0].node().remove_child("removal");
...