我有一个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没兴趣。
答案 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}}