相同的xpath在Centos上返回不同的值,Ubuntu

时间:2016-10-06 15:09:56

标签: python linux xpath centos lxml

我们正在尝试将我们的应用程序从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]')

On 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

这里发生了什么?

1 个答案:

答案 0 :(得分: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 /贴剂/ 0007 - 定位XPath的优化与 - predicates.patch:      
        
    • 上游补丁修复XPath评估问题。 (关闭:#713146)
    •   
  •