【问题标题】:Providing a default value parsing XML with ElementTree when findall() finds no match当 findall() 找不到匹配项时,使用 ElementTree 提供解析 XML 的默认值
【发布时间】:2017-11-14 04:39:57
【问题描述】:

对 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)。在这些情况下,会出现以下错误:未定义名称“provisions”。

我需要使用变量来进一步计算代码(例如:资产 - 规定),并且我需要在没有 (" nbb:ProvisionsDeferredTaxes[@contextRef='CurrentInstant']", ns) 元素。

我应该如何进行?

非常感谢!

【问题讨论】:

  • 使用标题的空间来包含问题的基本元素比实现语言更重要——标签用于显示和按语言过滤,除非在标题中包含自然流动的语言(并且很容易适应)。见discussion on meta

标签: python xml elementtree


【解决方案1】:

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)

【讨论】:

    猜你喜欢
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多