2

我正在尝试使用默认命名空间解析 XML 文档,即根节点有一个xmlns属性。如果您想尝试在子节点中查找某些标签,这很烦人,因为每个标签都以默认命名空间为前缀。

xml.etree.ElementTree.findall()允许namespaces传入字典,但我似乎无法找到默认命名空间映射到的内容。我试过使用'default'、None、'xmlns'但没有成功。

似乎确实有效的一个选项是在传递给的标签前面findall()加上'xmlns:'(编辑:这实际上可以是任意唯一名称)和命名空间字典中的相应条目,但我想知道这是否有必要。

编辑:我应该提到这是 Python 3.3.2。我相信旧版本的 Python,findall()不接受namespaces争论。

4

1 回答 1

2

决定看一下该方法的源代码。事实证明,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()。如果在标签中没有:找到,分词器只是简单地返回标签而不做任何替换。

于 2013-08-11T12:49:37.343 回答