【问题标题】:lxml searching for tags when namespaces are presentlxml 在存在命名空间时搜索标签
【发布时间】:2020-02-15 20:52:33
【问题描述】:

我对导航具有lxml.etree 命名空间的 xml 文档感到有些困惑。我看过一些关于这个主题的帖子(12)以及lxml docs,但仍然没有找到答案。

xml = """<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<sbml xmlns="http://www.sbml.org/sbml/level2" level="2" metaid="metaid_0000001" version="1">
    <model id="Teusink2000_Glycolysis" metaid="metaid_0000002" name="Teusink2000_Glycolysis">
        <annotation>
        </annotation>
    </model>
</sbml>"""
from lxml import etree
utf8_parser = etree.XMLParser(encoding='utf-8')
xml = etree.fromstring(xml.encode('utf-8'), parser=utf8_parser)

搜索根元素似乎不起作用,但我想那是因为它是根元素,因此您实际上不需要搜索它

print(xml.nsmap)
print(xml.findall('sbml'))
print(xml.findall('sbml', namespaces=xml.nsmap))
print(xml.findall('sbml', namespaces={'': 'http://www.sbml.org/sbml/level2'}))

生产

{None: 'http://www.sbml.org/sbml/level2'}
[]
[]
[]

不过,搜索 model 元素,只要你给它一个命名空间就行了

print(xml.findall('model'))
print(xml.findall('model', namespaces=xml.nsmap))
print(xml.findall('model', namespaces={'': 'http://www.sbml.org/sbml/level2'}))

生产

[]
[<Element {http://www.sbml.org/sbml/level2}model at 0x2125d7c0888>]
[<Element {http://www.sbml.org/sbml/level2}model at 0x2125d7c0448>]

但是,搜索annotation 元素并没有像我预期的那样工作。

print(xml.findall('annotation'))
print(xml.findall('annotation', namespaces=xml.nsmap))
print(xml.findall('annotation', namespaces={'': 'http://www.sbml.org/sbml/level2'}))

生产

[]
[]
[]

有人能指出我在这里缺少什么吗?

【问题讨论】:

    标签: python namespaces lxml


    【解决方案1】:

    您的语法错误。您只能使用annotation 搜索当前级别。如果要搜索整棵树,需要使用print(xml.findall('.//annotation', namespaces=xml.nsmap))

    print(xml.findall('.//annotation', namespaces=xml.nsmap))
    # [<Element {http://www.sbml.org/sbml/level2}annotation at 0x7fbcb9a14308>]
    

    【讨论】:

      猜你喜欢
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多