2016-05-25 7 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> 

私はないitがPugiXMLを使用して開始しid属性がある子ノード<B></B>を持って<A></A>の子ノードを削除するにはどうすればよいです。 結果は以下のようになります:は、親から子ノードを削除 - 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

関連する問題