python - 在 Python 中创建与 xml.etree.ElementTree.findall() 一起使用的字典时,是否有默认命名空间的键?

标签 python xml elementtree

我正在尝试使用默认命名空间解析 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/

相关文章:

python - 在 neo4j 中存储(和查询)python ipaddress 数据类型

python - 将嵌套的 dict/json 转换为 django ORM 模型,无需对数据结构进行硬编码

python - Django:模板和遍历字典

xml - 使用 XML 数据和 XPath 的 SSRS

sql - 获取 SQL XML 标记以显示 NULL 值

python - 二进制 1d Numpy 数组到整数的最快一对一映射

python - 在 .svg xml 中按 ID 选择元素

python - xml.etree.ElementTree.ParseError -- 异常处理未捕获错误

python elementtree xml追加

java - org.dom4j.DocumentException : Stream closed Nested exception: Stream closed