ElementTree XPath奇怪的行为

时间:2011-02-16 16:19:36

标签: 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>

问题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实施中的错误?

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

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

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

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

有没有办法告诉ElementTree在解析过程中忽略xmlns并将所有元素的名称(包括root)视为没有前缀?

的问候,
布里

1 个答案:

答案 0 :(得分: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

然后返回正确的结果而没有虚拟儿童黑客。