@Qk4l

Cрабатывание element.remove(subelement) в цикле через раз

Добрые люди, подскажите пожалуйста где я ошибся…
Есть xml вида
<server>
  <User> 
    <Username>user</Username>
    <Password>pass</Password>
      <list>
      <Item c="ru" askstatus="-1" recvstatus="-1" substatus="3" name="Roman"> </Item>
      <Item c="ru" askstatus="-1" recvstatus="-1" substatus="3" name="Roman"> </Item>
      <Item c="ru" askstatus="-1" recvstatus="-1" substatus="3" name="Roman"> </Item>
      <Item c="com askstatus="-1" recvstatus="-1" substatus="3" name="Roman"> </Item>
   </list>
  </User>
</server>


Необходимо удалить все строчки item с атрибутом c=«ru».

Мой код.

#!/usr/bin/env python
import xml.etree.ElementTree as etree
import sys
tree = etree.parse(sys.argv[1])
root = tree.getroot()

for user in root:                                                                                                                                                                                                   
    for param in user:
        if param.tag == 'list':
            for item in param:
                if str(item.get('c')) == 'ru': 
                    param.remove(item)
tree.write('output.xml')


Проблема в том, что удаляются не все вхождения, а только половина.
Спасибо.
  • Вопрос задан
  • 2758 просмотров
Решения вопроса 1
Если глянуть в ElementTree.__getitem_(self, index), то можно заметить что с каждой итерацией item в params передается index: первая итерация 0, вторая — 1и дт
    def __getitem__(self, index ):
        return self._children[index]

Но, вы удаляете элементы из param, следовательно:
при первой итерации у вас первый item, который удалится
при второй item (который был третим), который удаляется
выходим из цикла

Итого у Вас остаются в params два item
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Qk4l Автор вопроса
Нашел решение:
Загонять в список элементы на удаление. А потом, выйдя из основного цикла, их удалять.

Только все равно не понял, почему так. =(
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы