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

Wie kann ich untergeordneten Knoten <A></A> entfernen, die Kind-Knoten hat <B></B> die id Attribut hat nicht beginnt mit it PugiXML verwenden. Das Ergebnis wäre, wie unten sein:Kind-Knoten von den Eltern - PugiXML

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

Also, was denken Sie? Auf welche Methode bist du gekommen? –

+0

Ich versuche, Xpath zu verwenden, um nach Kindknoten zu suchen, die ich nicht möchte, und es dann von dem Elternknoten zu entfernen, aber es scheint, dass die API diese Art von Funktionalität nicht aufweist. Also, würde ich versuchen, alles zu entfernen und dann die erforderlichen Kind-Knoten zurück, wenn es keine andere Alternative gibt. – vincent911001

Antwort

2

Das ist etwas heikel, wenn Sie Knoten entfernen möchten, während Iterieren (um die Single-Pass-Code zu halten). Hier ist eine Möglichkeit, es zu tun:

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; 
} 

Alternativ können Sie nur XPath verwenden und die Ergebnisse entfernen:

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

Hallo, vielen Dank für deine Hilfe, ja, ich habe mich nur gefragt, ob es einen Weg gibt, es mit Xpath zu machen, vielen Dank. – vincent911001