【问题标题】:Parsing orphaned XML children解析孤立的 XML 子项
【发布时间】:2023-03-20 14:05:01
【问题描述】:

我一直在尝试使用 xml.etree 解析以下 XML 文件:Bills.xml

这是简单的python源码:xml.py

我能够使用 for 循环成功打印 BILLFIXED 下的子项。结果如下:

  • 1-Apr-2017 [注册债权人] 1
  • 1-Apr-2017 [注册债权人] 58

但是,正如您在 XML 中看到的某些孤儿,BILLCL BILLOVERDUE BILLDUE 在输出 XML 时不会考虑在逻辑上必须在 BILLFIXED 下,因为我们使用以下代码查找 BILLFIXED 下的所有元素:

billfixed = dom.findall('BILLFIXED')

有没有办法将 BILLCL、BILLDUE 和 BILLOVERDUE 包含在各自的列表中?我想不出任何逻辑可以帮助我将那些孤儿视为 BILLFIXED 的子孩子。

谢谢!

【问题讨论】:

  • 如果你可以控制 XML 的创建,你应该改变它。如果您必须处理它,您可以使用 XQuery 方法like these。但这取决于您使用的 XQuery 工具。如果您可以确定这些元素在任何情况下都存在,则可以将它们编号读出并与这些编号连接。

标签: python xml elementtree xml.etree


【解决方案1】:

你可以使用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 文件的结构,可能会更好。

【讨论】:

  • 谢谢!我的一个朋友能够使用 zip 为我提供正确的方向。我已经发布了答案。
【解决方案2】:

我的一个朋友能够回答并帮助我使用以下代码: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
))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    相关资源
    最近更新 更多