解析孤立的XML子项

时间:2018-03-08 14:55:43

标签: python xml elementtree xml.etree

我一直在尝试使用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子女的逻辑。

谢谢!

2 个答案:

答案 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
))