2016-12-22 4 views
0

Я пишу скрипт, который должен удалить родительские элементы из файла XML, если дочерний элемент соответствует элементу в CSV-файле. Операторы цикла и if работают корректно, однако, когда я добавляю удаление, он просто удаляет все из таблицы независимо от того, совпадает ли это или нет. Я не могу понять, почему он это делает.Python XML ElementTree Удаление всех элементов

cs = open('skus.csv', 'rb') 
reader = csv.reader(cs) 


tree = et.parse('christmas-dog-price.xml') 
root = tree.getroot() 
xmlns = {'pricebook': '{http://www.demandware.com/xml/impex/pricebook/2006-10-31}'} 
price_table = root.find('.//{pricebook}price-table'.format(**xmlns)) 
product_id = [price_table.get('product-id') for price_table in root] 
for sku in reader: 
    for product in product_id: 
     for price_table in root: 
      if sku[0] != product: 
       continue 
      if sku[0] == product: 
       root.remove(price_table) 
      tree.write('please-work.xml') 
+0

не должен ли этот 'tree.write ('please-work.xml')' находиться вне петель? –

+0

, пожалуйста, поделитесь структурой xml и инициализацией переменных для 'product' и' root' и 'tree' –

+0

@ XML-структура vikashSingh (без заголовков): <цена-таблица product-id =" tr-33373 "> <количество количества = "1"> 11.99

ответ

1

В вашем коде вы получаете все идентификаторы продуктов из xml и сравниваете их с каждым идентификатором в вашем csv-файле. Если какие-либо совпадения, вы удаляете каждый элемент из корня.

Ваш код эквивалентен следующему:

for sku in reader: 
    for product in product_id: 
     if sku[0] == product: 
      for price_table in root: 
       root.remove(price_table) 
tree.write('please-work.xml') 

что эквивалентно следующему:

if any(sku[0] in product_id for sku in reader): 
    for price_table in root: 
     root.remove(price_table) 
tree.write('please-work.xml') 

Вы должны сравнить только текущий продукт идентификатор, который каждый идентификатор CSV-файла:

with open('skus.csv', 'rb') as cs: 
    reader = csv.reader(cs) 
    product_ids = [sku[0] for sku in reader] 

tree = et.parse('christmas-dog-price.xml') 
root = tree.getroot() 
xmlns = {'pricebook': '{http://www.demandware.com/xml/impex/pricebook/2006-10-31}'} 
price_table = root.find('.//{pricebook}price-table'.format(**xmlns)) 
to_be_removed = [element for element in price_table if price_table.get('product-id') in product_ids] 
for element in to_be_removed: 
    root.remove(element) 
+0

это имеет смысл. Спасибо –