首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从父- PugiXML中删除子节点

从父- PugiXML中删除子节点
EN

Stack Overflow用户
提问于 2016-05-25 03:43:51
回答 2查看 2.7K关注 0票数 2
代码语言:javascript
复制
<Node>
  <A>
    <B id = "it_DEN"></B>
  </A>
  <A>
    <B id = "en_KEN"></B>
  </A>
  <A>
    <B id = "it_BEN"></B>
  </A>
</Node>

如何删除具有属性it (而不是属性id )的子节点<B></B>的子节点,该子节点使用PugiXML启动。结果如下:

代码语言:javascript
复制
<Node>
  <A>
    <B id = "it_DEN"></B>
  </A>
  <A>
    <B id = "it_BEN"></B>
  </A>
</Node>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-25 04:55:02

如果您想在迭代时删除节点(以保持代码的一次传递),这就有点棘手了。有一种方法可以做到:

代码语言:javascript
复制
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并删除结果:

代码语言:javascript
复制
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());
票数 7
EN

Stack Overflow用户

发布于 2020-05-30 11:33:07

另一种方法是在删除子元素之前增加迭代器。在迭代时移除属性。

代码语言:javascript
复制
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);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37427435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档