我一直在尝试使用xml.etree解析以下XML文件:Bills.xml
这是一个简单的python源:xml.py
我可以使用for循环在BILLFIXED下成功打印子节点。结果如下:
- 2017年4月1日[注册债权人] 1
- 2017年4月1日[注册债权人] 58
但是,正如您在XML中看到的某个孤立子级,在输出XML时不会考虑BILLCL BILLOVERDUE BILLDUE(逻辑上必须在BILLFIXED下),因为我们使用以下代码在BILLFIXED下找到所有元素:
billfixed = dom.findall('BILLFIXED')
是否有任何方法可以将BILLCL,BILLDUE和BILLOVERDUE纳入其各自的列表中?我无法想到任何可以帮助我认为那些孤儿被视为BILLFIXED子女的逻辑。
谢谢!
答案 0 :(得分:0)
您可以使用zip
:
for bill_fixed_node, bill_cl in zip(root.findall('BILLFIXED'), root.iter('BILLCL')):
print(bill_fixed_node)
print(bill_cl.text)
# <Element 'BILLFIXED' at 0x07905120>
# 600.00
# <Element 'BILLFIXED' at 0x079052D0>
# 10052.00
但是,如果您可以控制它,那么修复XML文件的结构可能会更好。
答案 1 :(得分:0)
我的一位朋友能够使用以下代码回答并帮助我:https://gist.github.com/anonymous/dba333b6c6342d13d21fd8c0781692cb
from xml.etree import ElementTree
dom = ElementTree.parse('bills.xml')
billfixed = dom.findall('BILLFIXED')
billcl = dom.findall('BILLCL')
billdue = dom.findall('BILLDUE')
billoverdue = dom.findall('BILLOVERDUE')
for fixed, cl, due, overdue in zip(billfixed, billcl, billdue, billoverdue) :
party = fixed.find('BILLDATE').text
date = fixed.find('BILLREF').text
ref = fixed.find('BILLPARTY').text
print(' * {} [{}] {} + {} + {} + {}'.format(
party, ref, date, cl.text, due.text, overdue.text
))