ElementTree XPath 异常行为

3 投票
1 回答
549 浏览
提问于 2025-04-16 11:56

你好,
我在使用 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>

问题 1:
当我用 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 的一个 bug?

问题 2:
我还有一个问题是关于 xmlns 的。
假设我把 XML 的第一行改成包含 xmlns

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

在这种情况下,我必须把查找字符串改成:

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

有没有办法让 ElementTree 在解析时忽略 xmlns,并把所有元素的名字(包括根元素)当作没有前缀来处理呢?

祝好,
Zbigniew

1 个回答

1

对于第一个问题:
当我把这几行

    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

之后,就能得到正确的结果,而不需要使用那些临时的子元素技巧。

撰写回答