我正在尝试使用默认命名空间解析 XML 文档,即根节点具有 xmlns
属性。如果您想尝试在子节点中查找某些标签,这会很烦人,因为每个标签都以默认 namespace 为前缀。
xml.etree.ElementTree.findall()
允许传入 namespaces
字典,但我似乎找不到默认 namespace 映射到的内容。我尝试过使用“默认”、“无”、“xmlns”,但没有成功。
似乎确实有效的一个选项是在传递给 findall()
的标记前加上“xmlns:”(编辑:实际上可以是任意唯一名称)以及相应的条目命名空间字典,但我想知道这是否有必要。
编辑:我应该提到这是Python 3.3.2。我相信在旧版本的 Python 中,findall()
不接受 namespaces
参数。
最佳答案
决定看一下该方法的源代码。事实证明,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()
的标记。如果在标记中找不到 :
,分词器只会返回标记而不进行任何替换。
关于python - 在 Python 中创建与 xml.etree.ElementTree.findall() 一起使用的字典时,是否有默认命名空间的键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18171311/