2016-07-07 2 views
0

мой первый вопросУдалить ребенок XML элемент с определенным атрибутом в питона

Я пытаюсь выяснить дамп базы данных ESHOP продуктов, которые либо не имеют цены или количества установлены. Поэтому я готов только продать продукты. Я пытаюсь сделать это через скрипт python. После того, как сценарий не смог выполнить то, что я намеревался, я попытался создать тестовый скрипт.

входной файл test.xml

<Result > 
<StoItem Code="A" Id="1" QtyFree="2" PriceEU="124.5"> 
    <ImgGal /> 
</StoItem> 
<StoItem Code="B" Id="2" QtyFree="2" PriceEU="124.5"> 
    <ImgGal /> 
</StoItem> 
<StoItem Code="C" Id="3" PriceEU="124.5"> 
    <ImgGal /> 
</StoItem> 
<StoItem Code="D" Id="4" QtyFree="2" > 
    <ImgGal /> 
</StoItem> 
</Result> 

Теперь мой скрипт выглядит следующим образом:

import xml.etree.ElementTree as ET 
tree = ET.parse('test.xml') 
root = tree.getroot() 
atb='QtyFree' 
for child in root: 
    print('Checking element no. '+child.attrib['Id']) 
     if atb in child.attrib: 
      print('In '+child.attrib['Id']+' found '+atb) 
      print('deleted '+child.attrib['Id']) 
     else: 
      print('In '+child.attrib['Id']+'not found '+atb) 
tree.write('output.xml') 

Теперь выход правильно определены элементы, которые должны быть удалены, как:

Checking element no. 1 
In 1 found QtyFree 
deleted 1 
Checking element no. 2 
In 2 found QtyFree 
deleted 2 
Checking element no. 3 
In 3not found QtyFree 
Checking element no. 4 
In 4 found QtyFree 
deleted 4  

Но когда я поместил фактическую функцию удаления в скрипт:

if atb in child.attrib: 
    print('In '+child.attrib['Id']+' found '+atb) 
    root.remove(child) 
    print('deleted '+child.attrib['Id']) 

я получаю что-то вроде этого:

Checking element no. 1 
In 1 found QtyFree 
deleted 1 
Checking element no. 3 
In 3not found QtyFree 
Checking element no. 4 
In 4 found QtyFree 
deleted 4 

И output.xml выглядит следующим образом:

<Result> 
<StoItem Code="B" Id="2" PriceEU="124.5" QtyFree="2"> 
    <ImgGal /> 
</StoItem> 
<StoItem Code="D" Id="4" QtyFree="2"> 
    <ImgGal /> 
</StoItem> 
</Result> 

Значение, что

1) Удалены правильный элемент

2) Не удаляли правильный элемент

и 3) Удален некорректный элемент

Так что, если кто-нибудь знает, что и где ошибка, я был бы очень рад, Спасибо за ваше время. Я также открыт для критики моего вопроса и что я сделал не так, и что я мог бы сделать лучше.

ответ

0

Проблема в том, что вы изменяете дерево, пока вы перебираете его.

Вместо

for child in root: 

использование

for child in tree.findall('.//StoItem'): 

Смотреть это answer

+0

Спасибо, я люблю тебя – Budbreaker

Смежные вопросы