lxml 在名称空间存在时搜索标签
lxml searching for tags when namespaces are present
我对导航具有 lxml.etree
名称空间的 xml 文档感到有点困惑。我已经看到了一些关于这个主题的话题(1, 2) as well as the 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'}))
生产
[]
[]
[]
有人能指出我在这里遗漏了什么吗?
你的语法有误。您只能使用 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>]
我对导航具有 lxml.etree
名称空间的 xml 文档感到有点困惑。我已经看到了一些关于这个主题的话题(1, 2) as well as the 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'}))
生产
[]
[]
[]
有人能指出我在这里遗漏了什么吗?
你的语法有误。您只能使用 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>]