正在解析 XML 个孤儿
Parsing orphaned XML children
我一直在尝试使用 xml.etree 解析以下 XML 文件:Bills.xml
这是简单的 python 来源:xml.py
我能够使用 for 循环成功地在 BILLFIXED 下打印子项。结果如下:
- 1-Apr-2017 [Registered Creditor] 1
- 1-Apr-2017 [Registered Creditor] 58
但是,正如您在 XML 某些孤儿中看到的那样,当我们发现所有BILLFIXED 下的元素使用以下代码:
billfixed = dom.findall('BILLFIXED')
有什么方法可以将 BILLCL、BILLDUE 和 BILLOVERDUE 包含在它们各自的列表中吗?我想不出任何逻辑可以帮助我将那些孤儿视为 BILLFIXED 的子子女。
谢谢!
您可以使用 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 文件的结构,那么修复它可能会更好。
我的一个朋友能够通过以下代码回答并帮助我: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
))
我一直在尝试使用 xml.etree 解析以下 XML 文件:Bills.xml
这是简单的 python 来源:xml.py
我能够使用 for 循环成功地在 BILLFIXED 下打印子项。结果如下:
- 1-Apr-2017 [Registered Creditor] 1
- 1-Apr-2017 [Registered Creditor] 58
但是,正如您在 XML 某些孤儿中看到的那样,当我们发现所有BILLFIXED 下的元素使用以下代码:
billfixed = dom.findall('BILLFIXED')
有什么方法可以将 BILLCL、BILLDUE 和 BILLOVERDUE 包含在它们各自的列表中吗?我想不出任何逻辑可以帮助我将那些孤儿视为 BILLFIXED 的子子女。
谢谢!
您可以使用 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 文件的结构,那么修复它可能会更好。
我的一个朋友能够通过以下代码回答并帮助我: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
))