how to remove an element in lxml
Question: I need to completely remove elements, based on the contents of an attribute,
using python's lxml. Example:

    
    
    import lxml.etree as et
    
    xml="""
    <groceries>
      <fruit state="rotten">apple</fruit>
      <fruit state="fresh">pear</fruit>
      <fruit state="fresh">starfruit</fruit>
      <fruit state="rotten">mango</fruit>
      <fruit state="fresh">peach</fruit>
    </groceries>
    """
    
    tree=et.fromstring(xml)
    
    for bad in tree.xpath("//fruit[@state=\'rotten\']"):
      #remove this element from the tree
    
    print et.tostring(tree, pretty_print=True)
    

I would like this to print:

    
    
    <groceries>
      <fruit state="fresh">pear</fruit>
      <fruit state="fresh">starfruit</fruit>
      <fruit state="fresh">peach</fruit>
    </groceries>
    

Is there a way to do this without storing a temporary variable and printing to
it manually, as:

    
    
    newxml="<groceries>\n"
    for elt in tree.xpath('//fruit[@state=\'fresh\']'):
      newxml+=et.tostring(elt)
    
    newxml+="</groceries>"
    


Answer: Use the
[`remove`](http://docs.python.org/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.remove)
method of an xmlElement :

    
    
    tree=et.fromstring(xml)
    
    for bad in tree.xpath("//fruit[@state=\'rotten\']"):
      bad.getparent().remove(bad)     # here I grab the parent of the element to call the remove directly on it
    
    print et.tostring(tree, pretty_print=True, xml_declaration=True)
    

If I had to compare with the @Acorn version, mine will work even if the
elements to remove are not directly under the root node of your xml.

