【问题标题】:Same xpath returns different values on Centos, Ubuntu相同的 xpath 在 Centos、Ubuntu 上返回不同的值
【发布时间】:2017-02-15 09:55:31
【问题描述】:

我们正在尝试将我们的应用程序从 Centos 环境移植到其他 linux,尤其是 Ubuntu。该应用程序是基于 python 的,所以应该没有问题,但是我们在解析 XPATH 时发现了一个奇怪的行为。

示例文件:

<root>
    <outer>
        <inner>
            <el/>
        </inner>
        <inner>
            <el/>
        </inner>
    </outer>
</root>

代码:

from lxml import etree
r = etree.parse('foo.xml')
print 'One: ', r.xpath('.//el[2]')
print 'Two: ', r.xpath('(.//el)[2]')

在 Centos (python 2.7.5) 上:

One:  [<Element el at 0x25fdcf8>]
New version:  [<Element el at 0x25fdcf8>]

在 RedHat Enterprise 6.6 (python 2.7.11) 上

One:  []
Two:  [<Element el at 0x7fa27198cd40>]

在 Debian 和 Ubuntu(python 2.7.9 和 2.7.12)上:

One:  []
Two:  [<Element el at 0x7f94ed6cf200>]

这是试图访问第二个元素el相同代码。

Debian、Ubuntu 和 Cents 环境具有 lxml(从 pip 安装)版本 3.6.4。安装 lxml 时,它会针对 libxml2 进行编译,即

在 debian 上:

    $ dpkg -l | grep libxml2-dev
ii  libxml2-dev:amd64                     2.9.1+dfsg1-5+deb8u2                 amd64

在centos上:

$ rpm -q libxml2-devel
libxml2-devel-2.9.1-6.el7_2.3.x86_64

RedHat 运行 etree 3.6.0:

$ rpm -q libxml2-devel
libxml2-devel-2.7.6-21.el6.x86_64

这是怎么回事?

【问题讨论】:

  • 相同的python版本?
  • @Hackerman 不,实际上 Debian 在 2.7.9 上运行。 Ubuntu 2.7.12 和 Centos 2.7.5。这怎么可能相关?
  • 每个 import lxml.etree;lxml.etree.LIBXML_COMPILED_VERSION 输出什么?因为你现在有某个版本并不意味着它是针对它编译的
  • @PadraicCunningham 结果是:(2,9,1) 在 centos 和 debian 上; (2,9,3) 在 ubuntu 上; (2,7,6) 在红帽上。它与不同的输出无关,因为 centos 和 debian 为相同的 xpath 返回不同的值。

标签: python linux xpath centos lxml


【解决方案1】:

CentOS 上的结果不正确。

libxml2 2.9.0 引入了回归,请参阅libxml 2.9.0 XPath evaluation issue。它在 2.9.2 中已修复,但在 2.9.1 中未修复。

Debian 已经在 2.9.1+dfsg1-3 版本中集成了补丁:

libxml2 (2.9.1+dfsg1-3) 不稳定;紧迫性=低

  • debian/patches/0007-Fix-XPath-optimization-with-predicates.patch:
    • 修复 XPath 评估问题的上游补丁。 (关闭:#713146)

【讨论】:

  • 这就是为什么它在 RedHat(运行 2.7.6)中给出与 Debian 相同的结果?
  • @lorenzog 确切地说,RHEL 使用 libxml2 2.7.6,并且该错误已在 libxml2 2.9.0 中引入。
  • 非常感谢。鉴于错误报告使用稍微不同的符号“position()”而不是 [n],这将是不可能找到的。无论哪种方式,非常感谢。
  • 显然我需要等待 20 小时才能获得赏金。
  • @lorenzog 这很可能是因为赏金必须有至少 1 天的最短持续时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 2016-04-10
  • 2010-09-22
  • 1970-01-01
相关资源
最近更新 更多