2016-06-30 5 views
0

Функция iter() указывает на элемент, который я удалял из etree во время предыдущей итерации, почему iter() не обновляется с новым значением? что-то не так с кодом? Heres кодПочему iter() не обновляется с новым значением элементов etree в python?

root = etree.parse(open("Sample.xml",'r')) 
for e in root.iter(): 
    print etree.tostring(e) 
    b=root.getpath(e) 
    for bad in root.xpath(b): 
     if(some condition): 
      bad.getparent().remove(bad)#removing some elements in etree which are yet to come in the iter() 
    print etree.tostring(root, pretty_print=True, xml_declaration=True) 

Мой вход Xml:

<?xml version="1.0"?> 
<catalog> 
    <book id="bk101"> 
     <author>Gambardella, Matthew</author> 
     <title>XML Developer's Guide</title> 
     <genre>Computer</genre> 
     <price>44.95</price> 
     <publish_date>2000-10-01</publish_date> 
     <description>An in-depth look at creating applications 
     with XML.</description> 
    </book> 
    <book id="bk102"> 
     <author>Ralls, Kim</author> 
     <title>Midnight Rain</title> 
     <genre>Fantasy</genre> 
     <price>5.95</price> 
     <publish_date>2000-12-16</publish_date> 
     <description>A former architect battles corporate zombies, 
     an evil sorceress, and her own childhood to become queen 
     of the world.</description> 
    </book> 
    <book id="bk103"> 
     <author>fgh<a1>ss</a1><a2>dd</a2></author> 
     <title>Oberon's Legacy</title> 
     <genre>Fantasy</genre> 
     <price>5.95</price> 
     <publish_date>2001-03-10</publish_date> 
     <description>In post-apocalypse England, the mysterious 
     agent known only as Oberon helps to create a new life 
     for the inhabitants of London. Sequel to Maeve 
     Ascendant.</description> 
    </book> 
</catalog> 

После прохождения всех элементов в 1-й записи "Книга ID = bk101", мой etree обновляется

<?xml version='1.0' encoding='ASCII'?> 
<catalog> 
    <book id="bk101"> 
     <author>Gambardella, Matthew</author> 
     <title>XML Developer's Guide</title> 
     <genre>Computer</genre> 
     <price>44.95</price> 
     <publish_date>2000-10-01</publish_date> 
     <description>An in-depth look at creating applications 
     with XML.</description> 
    </book> 
    <book id="bk103"> 
     <author>fgh<a1>ss</a1><a2>dd</a2></author> 
     </book> 
    </catalog> 

, что я полностью удалил запись «book id = bk102», но во время следующего ее повторения указывается книга id = «bk102», элемент, который не находится в etree, и программа заканчивается, не переходя «book id = bk103» , почему она так себя ведет?

+0

Вообще говоря, 'iterators' может попасть в очень прикольные состояния при изменении вещи, которую они итерация, как они итерация над ним ... – mgilson

+0

Связанными: http://stackoverflow.com/a/38003580/748858 – mgilson

+0

Возможная ошибка? http://stackoverflow.com/q/37702011/748858 – mgilson

ответ

0

iter() documentation явно указано, что поведение не определено в том, когда дерево модифицируется:

Создает дерево итератор с текущим элементом в качестве корня. Итератор выполняет итерацию по этому элементу и всем элементам, расположенным ниже, в порядке документа (по глубине). Если тег не None или '*', из итератора возвращаются только те элементы, чей тег равен тегу. Если древовидная структура изменяется во время итерации, результат не определен.