正在解析 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
))