【问题标题】:ElementTree XPath strange behaviourElementTree XPath 奇怪的行为
【发布时间】:2011-02-16 16:19:35
【问题描述】:


我在 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 并将所有元素的名称(包括根)视为没有前缀?

问候,
兹比格纽

【问题讨论】:

    标签: python xml elementtree


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-31
      相关资源
      最近更新 更多