当 findall() 找不到匹配项时,使用 ElementTree 提供默认值解析 XML

Providing a default value parsing XML with ElementTree when findall() finds no match

对 Python 很陌生,我正在构建一个项目来学习 Python。该项目涉及XML解析,我使用了ElementTree。

这是我目前拥有的代码:

import xml.etree.ElementTree as etree
tree = etree.parse('ar.xml')
root = tree.getroot()

ns = {'nbb': 'http://www.nbb.be/be/fr/pfs/ci/2017-04-01'}

for ass in tree.findall("nbb:Assets[@contextRef='CurrentInstant']", ns):
    assets = ass.text

for pay in tree.findall("nbb:AmountsPayable[@contextRef='CurrentInstant']", ns):
    payables = pay.text

for prov in tree.findall("nbb:ProvisionsDeferredTaxes[@contextRef='CurrentInstant']", ns):
    provisions = prov.text

for cap in tree.findall("nbb:IssuedCapital[@contextRef='CurrentInstant']", ns):
    capital = cap.text

print assets
print payables
print provisions
print capital

对于大多数 XML 文件,这非常有效。

但是,我想使用代码的一些 XML 文件没有元素 ("nbb:ProvisionsDeferredTaxes[@contextRef='CurrentInstant']", ns)。在这些情况下,会出现以下错误:name 'provisions' is not defined.

我需要使用变量来进一步计算代码(例如:assets - provisions),我需要将 'provisions' 的值分配给 [=32= 中的 0 ] 没有 ("nbb:ProvisionsDeferredTaxes[@contextRef='CurrentInstant']", ns) 元素的文件。

我该如何进行?

非常感谢!

for/else 子句提供了一种处理方法:

for prov in tree.findall("nbb:ProvisionsDeferredTaxes[@contextRef='CurrentInstant']", ns):
    provisions = int(prov.text)
    break
else:
    provisions = 0

break 永远不会发生时,else 子句是 运行。


您也可以初始化该值,然后在循环中重新分配:

provisions = 0
for prov in tree.findall("nbb:ProvisionsDeferredTaxes[@contextRef='CurrentInstant']", ns):
    provisions = int(prov.text)