从父节点中删除子节点 - PugiXML
Remove child nodes from parent - PugiXML
<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
[=19 开头=] 使用 PugiXML。
结果如下:
<Node>
<A>
<B id = "it_DEN"></B>
</A>
<A>
<B id = "it_BEN"></B>
</A>
</Node>
如果您想在迭代时删除节点(以保持代码单次通过),这会有点棘手。这是一种方法:
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());
另一种方法是在删除子项之前递增迭代器。在迭代时删除属性。
for(pugi::xml_attribute_iterator it = node.attributes_begin(); it != node.attributes_end();){
pugi::xml_attribute attr = *it++;
if(should_remove(attr)){
node.remove_attribute(attr);
}
}
<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
[=19 开头=] 使用 PugiXML。
结果如下:
<Node>
<A>
<B id = "it_DEN"></B>
</A>
<A>
<B id = "it_BEN"></B>
</A>
</Node>
如果您想在迭代时删除节点(以保持代码单次通过),这会有点棘手。这是一种方法:
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());
另一种方法是在删除子项之前递增迭代器。在迭代时删除属性。
for(pugi::xml_attribute_iterator it = node.attributes_begin(); it != node.attributes_end();){
pugi::xml_attribute attr = *it++;
if(should_remove(attr)){
node.remove_attribute(attr);
}
}