在Python中创建用于xml.etree.ElementTree.findall()的字典时,是否有默认命名空间的键?
我试图用默认名称空间解析XML文档,即根节点具有在Python中创建用于xml.etree.ElementTree.findall()的字典时,是否有默认命名空间的键?,python,xml,elementtree,Python,Xml,Elementtree,我试图用默认名称空间解析XML文档,即根节点具有xmlns属性。如果您想在子节点中查找某些标记,这很烦人,因为每个标记都以默认名称空间作为前缀 xml.etree.ElementTree.findall()允许传入名称空间字典,但我似乎找不到默认名称空间映射到什么。我尝试过使用“default”、“None”和“xmlns”,但没有成功 一个似乎有效的选项是在传递给findall()的标记前面加上“xmlns:”(编辑:实际上可以是任意唯一的名称)和名称空间字典中的相应条目,但我想知道这是否必要
xmlns
属性。如果您想在子节点中查找某些标记,这很烦人,因为每个标记都以默认名称空间作为前缀
xml.etree.ElementTree.findall()
允许传入名称空间
字典,但我似乎找不到默认名称空间映射到什么。我尝试过使用“default”、“None”和“xmlns”,但没有成功
一个似乎有效的选项是在传递给findall()
的标记前面加上“xmlns:”(编辑:实际上可以是任意唯一的名称)和名称空间字典中的相应条目,但我想知道这是否必要
编辑:我应该提到这是Python3.3.2。我相信在Python的旧版本中,
findall()
不接受名称空间
参数。决定查看该方法的源代码。因此,事实证明,xml.etree.ElementPath中的以下代码正在进行肮脏的工作:
def xpath_tokenizer(pattern, namespaces=None):
for token in xpath_tokenizer_re.findall(pattern):
tag = token[1]
if tag and tag[0] != "{" and ":" in tag:
try:
prefix, uri = tag.split(":", 1)
if not namespaces:
raise KeyError
yield token[0], "{%s}%s" % (namespaces[prefix], uri)
except KeyError:
raise SyntaxError("prefix %r not found in prefix map" % prefix)
else:
yield token
pattern
是传递到findall()
的标记。如果在标记中找不到:
,则标记器只返回标记,而不进行任何替换。可能的重复。(答案似乎是“是的,必要的”)