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

时间:2017-11-14 04:39:58

标签: python xml elementtree

非常新的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文件没有Element(" nbb:ProvisionsDeferredTaxes [@contextRef =' CurrentInstant']", NS)。在这些情况下,出现以下错误:名称'条款'没有定义。

我需要使用这些变量在代码中进一步计算(例如:资产 - 条款),我需要'条款'的值。在没有(" nbb:ProvisionsDeferredTaxes [@contextRef =' CurrentInstant']",ns)元素的XML文件中分配给0。

我该怎么办?

非常感谢!

1 个答案:

答案 0 :(得分:0)

for / else子句提供了一种处理此问题的方法:

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

else子句在break永远不会发生的情况下运行。

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

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