2016-05-25 5 views
0
<Node> 
    <A> 
    <B id = "it_DEN"></B> 
    </A> 
    <A> 
    <B id = "en_KEN"></B> 
    </A> 
    <A> 
    <B id = "it_BEN"></B> 
    </A> 
</Node> 

Как удалить дочерний узел <A></A>, который имеет дочерний узел <B></B>, который имеет атрибут id не начинается с it использования PugiXML. Результат будет как показано ниже:Удалить дочерние узлы из родителей - PugiXML

<Node> 
    <A> 
    <B id = "it_DEN"></B> 
    </A> 
    <A> 
    <B id = "it_BEN"></B> 
    </A> 
</Node> 
+1

Так что же вы думаете? Какой метод вы придумали? –

+0

Я пытаюсь использовать Xpath для поиска дочерних узлов, которые я не хочу, а затем удаляю из родительского узла, но, похоже, API не обладает такой функциональностью. Итак, я думаю, я бы попытался удалить все это, а затем добавить нужные дочерние узлы, если нет другой альтернативы. – vincent911001

ответ

2

Это немного сложнее, если вы хотите удалить узлы в то время как итерация (держать код однопроходный). Вот один из способов сделать это:

bool should_remove(pugi::xml_node node) 
{ 
    const char* id = node.child("B").attribute("id").value(); 
    return strncmp(id, "it_", 3) != 0; 
} 

for (pugi::xml_node child = doc.child("Node").first_child(); child;) 
{ 
    pugi::xml_node next = child.next_sibling(); 

    if (should_remove(child)) 
     child.parent().remove_child(child); 

    child = next; 
} 

В качестве альтернативы вы можете просто использовать XPath и удалить результаты:

pugi::xpath_node_set ns = doc.select_nodes("/Node/A[B[not(starts-with(@id, 'it_'))]]"); 

for (auto& n: ns) 
    n.node().parent().remove_child(n.node()); 
+0

Привет, большое спасибо за вашу помощь, да, я просто задавался вопросом, есть ли способ сделать это с помощью xpath, спасибо большое. – vincent911001

Смежные вопросы