在lxml中按名称空间查找

时间:2020-02-28 09:48:43

标签: python xml lxml

我有一个xml文件,其中包含看起来像gnc:account的元素(这是gnucash帐户文件)。我想找到所有具有该名称的元素。

但是,如果我这样做;

for account in tree.iter('gnc:account'):
    print(account)

我什么也没打印。相反,我编写了这段荒谬的代码:

def n(string):
    pair = string.split(':')
    return '{{{}}}{}'.format(root.nsmap[pair[0]], pair[1])

现在我可以这样做:

for account in tree.iter(n('gnc:account')):
    print(account)

有效。

这个问题有非荒谬的解决方案吗?我对写出完整的URI没兴趣。

1 个答案:

答案 0 :(得分:2)

在我看来,您现在拥有的东西肯定太黑了。

XPath解决方案

您可以使用XPath,并注册此名称空间URI和前缀:

tree.iter()

使用iter()

如果您仍然想以这种方式呼叫>>> for account in tree.iter('{www.gnc.com}account'): ... print(account) ... <Element {www.gnc.com}account at 0x112bdd808> <Element {www.gnc.com}account at 0x112bdd948> ,则需要遵循lxml's advice on using namespaces with iter,例如:

>>> for account in tree.iter('{*}account'):
...     print(account)
...
<Element {www.gnc.com}account at 0x112bdd808>
<Element {www.gnc.com}account at 0x112bdd948>

如果您绝对想避免写出名称空间URI或注册名称空间(我认为这不是有效的参数,那很容易,也更清楚),您也可以使用

{{1}}