Chris
Chris

Reputation: 91

xml tree remove elements

I am trying to remove elements from my tree based on the elements attributes.

import xml.etree.cElementTree as ET
import requests

xml = requests.get("https://iptv-org.github.io/epg/guides/ca/sportsnet.ca.epg.xml").text
tree = ET.ElementTree(ET.fromstring(xml))
root = tree.getroot()

for elem in tree.iter():
    if elem.tag == "channel" or elem.tag == "programme":
        if elem.attrib.get("id", "") == "WWENetworkCanada.us" or elem.attrib.get("channel", "") == "WWENetworkCanada.us":
            pass
        else:
            print("removing")
            root.remove(elem)

ET.dump(root)

The dump still has the elements I am trying to remove, even though I see "removing". Can anyone see why?

I am expecting everything that is not "WWENetworkCanada.us" to be removed.

Thanks, Chris

Upvotes: 0

Views: 59

Answers (2)

Stephan
Stephan

Reputation: 6018

Saw you answered your own question, but thought I'd share as an alternate approach. Simply use findall() to find and remove any values that don't match what you are looking for

Remove Unwanted Elements using findall()

for elem in tree.findall("./channel/[@id!='WWENetworkCanada.us']"):
    root.remove(elem)
    
for elem in tree.findall("./programme/[@channel!='WWENetworkCanada.us']"):
    root.remove(elem)

Upvotes: 1

Chris
Chris

Reputation: 91

It was failing because I was changing indexes as I iterating and removing. What I needed to do was for elem in list(tree.iter()):. This is something I learnt some time ago (on here) that lets you remove while iterating without creating a "temp" list.

Upvotes: 1

Related Questions