6

I've read the remove example here and the example here is not applicable to me.

My xml file reads:

<A>
  <B>some text</B>
  <B>other text</B>
  <B>more text</B>
</A>

What I want to do is to remove the second <B></B> from the xml. I do not know what text it holds. But I have the index of the <B></B>, say index = 1, which means I want to remove the second element (or node).

I have a code like this:

F = open('example.xml')
self.tree = parse(F)
self.root = self.tree.getroot()
F.close()

So in this case what I want to remove is self.root[1].

How can this be implemented using ElementTree?

Edit: Made my question more clear and specific.

2 Answers 2

8
In [1]: import xml.etree.ElementTree as ET

In [2]: xmlstr=\
   ...: """
   ...: <A>
   ...:   <B>some text</B>
   ...:   <B>other text</B>
   ...:   <B>more text</B>
   ...: </A>
   ...: """

In [3]: tree=ET.fromstring(xmlstr)

In [4]: tree.remove(tree.findall('.//B')[1])
Sign up to request clarification or add additional context in comments.

1 Comment

I had to replace tree. with tree.getroot(). for this to work
3

You guys are not straight to the point. I've combined my knowledge with the answers here and came out with this:

for i, child in enumerate(self.root):
    if path == i:
        self.root.remove(child)
        break

where path is the index of the item I want to remove.

2 Comments

@ elwz -- and how is that better than tree.remove(tree.findall('.//B')[1]) ?
My apologies. It did work now. Just that I was confused about tree and root (originally in the question). I'll give you the honor.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.