python - ElementTree XPath 奇怪的行为

标签 python xml elementtree

你好
我在 Python 2.7 中使用 ElementTree (1.3) 并享受 XPath 功能,
然而,其中一个搜索结果让我感到惊讶。

我的 XML 示例:

<OTF>
  <FECS state="disabled" version="2.2.0.0">
    <BackEndCompatibility major="2.2" state="disabled">
        <BackEnd state="disabled" version="2.2.0.0"/>
    </BackEndCompatibility>
  </FECS>
</OTF>

问题一:
当我使用 findall 获取第一个找到的元素时

version = "2.2.0.0"
found = list(txml.findall(".//BackEnd[@version='%s']" % version))
return found and found[0] or None

它什么也没找到。

然而,当我更改 XML 文件时,BackEnd 元素包含子元素

        <BackEnd state="disabled" version="2.2.0.0">
           <any_dummy_element/> 
        </BackEnd>

然后正确找到搜索到的元素。

你遇到过这样的行为吗?
我是不是做错了什么或者这是 ElementTree 实现中的错误?

问题二:
我遇到的另一个问题是 xmlns
假设我将 XML 第一行更改为包含 xmlns:

<OTF xmlns="http://si-wiki/OTFCompatibility">
</OTF>

在这种情况下,我必须将查找字符串更改为:

".//{http://si-wiki/OTFCompatibility}BackEnd[@version='%s']"

有什么方法可以告诉 ElementTree 在解析期间忽略 xmlns 并将所有元素的名称(包括根)视为没有前缀?

问候,
兹比格涅夫

最佳答案

对于第一个问题:
当我替换行时

    found = list(txml.findall(".//BackEnd[@version='%s']" % version))
    return found and found[0] or None

    found = txml.findall(".//BackEnd[@version='%s']" % version)
    if found:
        return found[0]
    return None

然后返回正确的结果,没有虚拟 child hack。

关于python - ElementTree XPath 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5019001/

相关文章:

python - 在新的virtualenv中安装wheel软件包时,导入旧django项目模型的任何方法

python - 如何在 Python 中有条件地导入?

c# - 如何查询xsi :type from an attribute using Linq to XML?

python - 关于python GUI的问题

python - xlwt 错误消息 IOError : [Errno 13] Permission denied: 'python_spreadsheet.xls'

Java XML getElementsByTagName() 函数

xml - 使用 Spark/Scala 从 XML 记录中提取元素

python - 从子节点之后的 XML 节点中提取文本

python - 如何处理python元素树中xpath的多个搜索条件

python - 使用 Python 的 elementtree 为带有文本的节点添加书尾