Я хочу создать файл XML через файл .txt следующим образом:
1header
2client_1
3total_1
4promo_1
5promo_1_data
2client_2
3total_1
3total_2
4promo_1
4promo_1
4promo_1
5promo_1_data
4promo_2
5promo_2_data
Каждая строка начинается с определенного c числа, это число является идентификатором типа записи. Например, номер 2 - это идентификатор нового клиента, поэтому все записи, которые идут после него, принадлежат этой сводке до тех пор, пока итерация не получит другой идентификатор 2 и не создаст другую сводку со своими данными c.
Тем не менее, желаемый результат XML:
<SummaryList>
<Summary>
<Client_1></Client_1>
<Total_1></Total_1>
<Client_Promotions>
<Promotion>
<Promo_1></Promo_1>
<Promo_1_data></Promo_1_data>
<Promotion>
</Client_Promotions>
</Summary>
<Summary>
<Client_2></Client_2>
<Total_1></Total_1>
<Total_2></Total_2>
<Client_Promotions>
<Promotion>
<Promo_1></Promo_1>
<Promo_1></Promo_1>
<Promo_1></Promo_1>
<Promo_1_data></Promo_1_data>
<Promotion>
<Promotion>
<Promo_2></Promo_2>
<Promo_2_data></Promo_2_data>
</Promotion>
</Client_Promotions>
</Summary>
</SummaryList>
Я пробовал это:
filepath = 'data.txt'
lst = []
with open(filepath) as fp:
line = fp.readline()
while line:
line = fp.readline()
lst.append(line)
Для создания списка и разделения каждой строки на элемент на этот list, поэтому я могу выполнять итерацию, например:
from lxml import etree as ET
root = ET.Element('SummaryList')
root.text = '\n'
max_lines = len(lst)
line_number = 0
while line_number <= max_lines:
if lst[line_number][0] == '2':
a = lst[line_number]
summary = ET.Element('Summary')
summary.text = '\n'
root.append(summary)
dc = ET.Element("Client")
dc.text = '\n'
summary.append(dc)
e = ET.SubElement(dc, "someClientData")
e.text = a[1:19].strip()
e.tail = '\n'
dc.tail = '\n'
totalDescount = ET.Element("Total") # id record type 3
totalDescount.text = '\n'
summary.append(totalDescount)
promoDetail = ET.Element("ClientPromotions") # id record type 4
promoDetail.text = '\n'
summary.append(promoDetail)
summary.tail = '\n'
if lst[line_number][0] == '3':
a = lst[line_number]
subtotal = ET.Element("SubTotal")
subtotal.text = '\n'
totalDescount.append(subtotal)
e = ET.Element("description")
e.text = a[1:101].strip()
e.tail = '\n'
subtotal.append(e)
e = ET.Element("someData")
e.text = format_money(a[101:116])
e.tail = '\n'
subtotal.append(e)
subtotal.tail = '\n'
totalDescount.tail = '\n'
if lst[line_number][0] == '4':
a = lst[line_number]
promotion = ET.SubElement(promoDetail, "Promotion") # registro 4 sub array
promotion.text = '\n'
promo = ET.Element("Promo")
promo.text = '\n'
promotion.append(promo)
e = ET.SubElement(promo, "someClientData")
e.text = a[1:19]
e.tail = '\n'
promo.tail = '\n'
promotion.tail = '\n'
promoDetail= '\n'
if lst[line_number][0] == '5':
a = lst[line_number]
promoData = ET.Element("Promo_data")
promoData.text = '\n'
promotion.append(promoData)
promoData.tail = '\n'
line_number += 1
Я создаю promoDetail
в итерации сводки, потому что мне нужен только один из этих тегов в каждой сводке. Но мне нужно создать тег продвижения для каждого типа записи идентификатора 4, пока он не найдет тип записи идентификатора 5. Я не могу этого добиться. Я получаю эту ошибку:
Traceback (most recent call last):
File "C:/Users/tartega/PycharmProjects/LP/test.py", line 211, in <module>
promotion = ET.SubElement(promoDetail, "Promotion")
TypeError: Argument '_parent' has incorrect type (expected lxml.etree._Element, got str)
Если я добавлю сюда печать:
if lst[line_number][0] == '4':
a = lst[line_number]
print(type(promoDetail))
Я получаю такой результат:
<class 'lxml.etree._Element'>
<class 'str'>
Итак, это похоже, что первая итерация проходит хорошо, но вторая не создает этот элемент. Пожалуйста, помогите мне с этим? Я новичок с Python и l xml. Спасибо!