3


,我正在使用ElementTree(1.3) 和 Python 2.7 并享受 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 并将所有元素的名称(包括根)视为没有前缀?

问候,
兹比格纽

4

1 回答 1

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

然后返回正确的结果,而无需 dummy children hack。

于 2011-02-18T13:14:05.480 回答